我正在使用Netty4创建一个需要为多个客户端连接提供服务的服务器。 ServerBootstrap由Parent和worker线程组构成。根据ServerBootStrap.group()方法的文档
“为父(acceptor)和子(客户端)设置EventLoopGroup。这些EventLoopGroup用于处理SocketChannel和Channel的所有事件和IO。”
据我所知,ParentExecutor组将处理任何传入连接并将其传递给Child Executor组以执行。因此,为了服务于许多客户端,我有以下设置
final ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup(Runtime.getRuntime()
.availableProcessors() * 3))
.channel(NioServerSocketChannel.class)
.childHandler(new MyInitializer());
现在的问题是,我的处理程序中的以下方法是否会在子执行程序组上执行。我怀疑它是通过SingleThreadEventExecutor以单线程方式处理的吗?
protected void channelRead0(final ChannelHandlerContext ctx, final AppMessage msg)
final AppMessage msg) throws Exception {
答案 0 :(得分:1)
子组也称为工作组实际上是由Netty创建的一个线程(在Netty中称为EventLoop)池。默认的NioEventLoopGroup池大小为{{1}}。每当连接到来时,Netty将从子组中安排一个线程(也称为EventLoop)来处理通道和消息传输等等。属于ChannelPipeline的所有处理程序都将在此线程中执行。
答案 1 :(得分:0)
是的,处理程序将在fireChannelRead()执行期间在子线程组中执行