【问题标题】:Server Bootstrap releaseExternalResources stuck in loop服务器引导释放外部资源陷入循环
【发布时间】:2012-06-12 14:17:32
【问题描述】:

我的问题似乎与: https://issues.jboss.org/browse/NETTY-433

我正在尝试停止我的 Netty 服务器,但这个调用永远不会返回:

serverBootstrap.releaseExternalResources();

当试图关闭工作线程 ThreadPoolExecutor 时,它在 ExecutorUtil.terminate 方法中永远循环:

org.jboss.netty.util.internal.ExecutorUtil.terminate()
   for (;;) {
       es.shutdownNow(); 
       es.awaitTermination..
   }

问题是我无法控制连接到我的服务器的客户端。服务器有没有办法强制服务器停止并简单地关闭通道并停止工作线程?

【问题讨论】:

  • 您确定您没有尝试使用工作线程停止服务器?
  • 是的,正常停止它。相信这是因为客户端仍然有一个通道对我的服务器开放,所以我不能释放资源?有什么办法吗?

标签: netty


【解决方案1】:

根据Netty API,我个人遗漏的关键部分是:

 public class MyHandler extends SimpleChannelUpstreamHandler {
     @Override
     public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) {
         // Add all open channels to the global group so that they are
         // closed on shutdown.
         allChannels.add(e.getChannel());
     }
 }

换句话说,您还必须覆盖处理程序中的方法。

【讨论】:

    【解决方案2】:

    在执行 releaseAllResources 之前,您可以确保您的子频道已关闭,您可以在 ChannelGroup 中注册所有创建的子频道。当你关闭时,你可以在 ChannelGroup 上调用close(),这将关闭其中的所有频道。

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多