1

我正在使用 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 的预期行为?

4

2 回答 2

1

这实际上不是错误,而是预期的行为。考虑一个运行多个协议服务器的 JVM。假设这些服务器执行磁盘 I/O,并且您想限制跨 JVM 执行阻塞磁盘 I/O 的线程数。您可以为执行磁盘 I/O 的处理程序创建一个共享EventExecutorGroup,并在 JVM 中的多个协议服务器上使用它。

于 2013-04-02T06:48:46.340 回答
-1

我认为你是对的,这是一个错误。你能打开一个错误报告,这样我们就不会忘记修复它吗?

https://github.com/netty/netty/issues

于 2013-03-28T07:09:21.180 回答