【问题标题】:Netty 4 EventExecutorGroup shutdownNetty 4 EventExecutorGroup 关闭
【发布时间】:2013-04-02 14:48:46
【问题描述】:

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

【问题讨论】:

    标签: netty


    【解决方案1】:

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

    【讨论】:

    • 感谢 Trustin 的解释。
    【解决方案2】:

    我认为您是对的,这是一个错误。您能否打开错误报告,以便我们不要忘记修复它?

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

    【讨论】:

    • 这不是真的。请看我的回答。
    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2012-02-05
    • 2012-02-17
    • 2014-07-14
    • 2016-07-25
    相关资源
    最近更新 更多