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

时间:2019-05-24 11:42:51

标签: netty

我正在设置一个Netty Server来接受多个传入的客户端连接,这些连接反过来会进行一些处理,但是对于Wroker线程组与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 个答案:

答案 0 :(得分:0)

您不必创建具有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方法来拦截是否有人加入或连接是否有问题。

希望我能理解您的问题并帮助您了解它,

亲切的问候