我必须使用 netty 3.5.1 管理具有 > 1K 连接客户端的客户端服务器应用程序。有时,当我们通过重新启动服务器断开客户端连接时,写入数据库的更新会丢失。当执行重启/关闭时,我们像这样关闭我们的 Netty 组件:
- 关闭服务器通道
- 断开所有客户端(通过 ChannelGroupFuture)
- 在我们的 ChannelPipeline 上调用 releaseExternalResources()
- 在我们的 ExecutionHandler 上调用 releaseExternalResources() ,它是我们 ChannelPipeline 的一部分(是否需要手动调用它?)
但是我想知道为什么是 ExecutorUtil。terminate(由 ExecutionHandler 调用)对传递的 ExecutorService 执行 shutdownNow,因为shutdownNow会耗尽队列中的所有现有任务并返回它们。这些任务不会被执行,因为 ExecutorUtil. terminate是void类型。在 ExecutorService 上调用shutdown并等待完成不是更合适吗?