我正在设置一个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个线程的工作组池的作用是什么?
答案 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
方法来拦截是否有人加入或连接是否有问题。
希望我能理解您的问题并帮助您了解它,
亲切的问候