当前位置: 首页 > 知识库问答 >
问题:

Netty中的工作组与处理程序线程

司空朝
2023-03-14

我正在设置一个Netty服务器来接受多个传入的客户端连接,这将反过来做一些处理,但对wroker线程组vs Handler线程感到困惑

我尝试分配10个工作线程和20个处理线程,如下所示。

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(10);
EventExecutorGroup handlerThread = new DefaultEventExecutorGroup(20);

try {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup, workerGroup);
    serverBootstrap.channel(NioServerSocketChannel.class);
    serverBootstrap.localAddress(new 
    InetSocketAddress(hostName,Integer.parseInt(port)));

    // initialize a new child handler for incoming request
    logger.debug("Incoming request from TCP client...assigning a new Server Handler");
    serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
    protected void initChannel(SocketChannel socketChannel) throws Exception 
    {
    socketChannel.pipeline().addLast(handlerThread,new NettyServerHandler());
                }
            });
            ChannelFuture channelFuture = serverBootstrap.bind().sync();
            channelFuture.channel().closeFuture().sync();

        } catch (Exception e) {
            logger.error("Unable to initialize TCP Server");
        } 

我无法理解工作组的任务和创建新服务器处理程序之间的区别。据我所知,处理器线程池将分配给NettyServerHandler的每个实例。但是,创建由10个线程组成的工作组池的作用是什么呢?

共有1个答案

羊舌迪
2023-03-14

您不必创建一个包含10个线程的EventLoopGroup来接受10个客户端。只需在bossGroup上传递一个线程,而在workerGroup上传递一个线程就足够了:

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();

确保ServerBootstrap()。childOption(ChannelOption.SO_BACKLOG,10)设置为至少10以接受10个客户端。

所以EventLoopGroup的角色是接受我所知道的客户端。另一方面,ServerHandler用于接收数据并管理如何处理数据,您可以通过覆盖ChannelHandlerAdapter方法来拦截是否有人加入或连接是否有任何问题。

我希望我理解你的问题并帮助你理解它,

问候

 类似资料:
  • 基于文档https://netty . io/4.1/API/io/netty/channel/channel pipeline . html:< br > //告诉管道在与I/O线程不同的线程中运行MyBusinessLogicHandler的事件处理程序方法 //,这样I/O线程就不会被 //阻塞,这是一项耗时的任务。 //如果您的业务逻辑是完全异步的或很快就完成了,您不需要指定一个组。 pi

  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关

  • 我试图使用一个简单的服务器-客户端应用程序(代码见下文)进入Netty。 我在与两个问题作斗争: null KJ 这就是服务器的创建方式: 其中一个处理程序类(FeedbackServerHandler执行完全相同的操作,但解析为整数):

  • 我已经初始化了Netty服务器中的套接字通道,但我遇到了处理程序的问题,当我想通过JPA将从客户端接收到的数据保存到MySQL时,它无法保存。 文件夹结构是我收到的异常 在logger中,我收到“保存前”消息,但之后什么都没有,应用程序堆叠。 谢谢你的帮助

  • 我的RestController类: 我的ExceptionHandler: 例外响应:

  • 我有一个在Netty中实现的服务器,它工作得很好,但现在我试图优化一个方面。 传入通道是多路复用的,即每个客户机进程都有许多线程,通过一个连接发送请求并读取响应到服务器。 谢谢, 安迪。