我正在使用 Netty 4.0.0.Beta2
我有一个配置了多个处理程序的管道,其中最后一个在它自己的 EventExecutorGroup 中运行。有点像这样:
DefaultEventExecutorGroup separateGroup = new DefaultEventExecutorGroup();
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(AGGREGATE, new SomeHandler());
pipeline.addLast(ENCODE, new OtherHandler());
pipeline.addLast(extractEventGroup, EXECUTE, new ExecuteHandler());
然后,我使用此管道配置配置一个 ServerBootstrap,作为 ChannelInitalizer 的一部分。
当服务器运行时,我会跟踪一个名为“channels”的 ChannelGroup 中的所有当前客户端
后来,当我关闭服务器时,我刷新并关闭所有通道,然后调用
bootstrap.shutdown();
这会关闭 NIO EventExecutorGroup,但不会关闭我为 ChannelHandler 添加到管道中的单独 DefaultEventExecutorGroup - 这意味着 JVM 不会退出,因为线程仍然处于活动状态(只是在等待,但没有释放)。
我有点惊讶这也没有关闭,所以我现在保留对 DefaultEventExecutorGroup 的引用,并在我的 bootstrap.shutdown() 调用之后手动关闭它:
separateEventGroup.shutdown();
我错过了什么,还是 Netty 的预期行为?