首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当客户端连接打开时关闭Netty服务器

当客户端连接打开时关闭Netty服务器
EN

Stack Overflow用户
提问于 2012-06-06 09:58:33
回答 2查看 14K关注 0票数 5

我试图关闭一个打开连接的Netty服务器,然后它就挂起了。我就是这么做的。

  • 启动服务器在一台计算机上,客户端在另一台机器上。
  • 从客户端发送消息到服务器,我使用Ctrl-C

向该服务器发送消息。

我已经在关闭ChannelGroup并在ServerBootstrap上调用releaseExternalResources的服务器上注册了一个关机钩子(或者实际上我使用的是protobuf pro-duplex库的DuplexTcpServerBootstrap )。无论如何,关闭钩子在关闭时被正确调用,但它永远不会返回。当我对正在发生的事情抛出线程时,我可以看到两个有趣的堆栈:

代码语言:javascript
复制
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006b0890950> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
    at java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1433)
    at org.jboss.netty.util.internal.ExecutorUtil.terminate(ExecutorUtil.java:103)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.releaseExternalResources(AbstractNioWorkerPool.java:80)
    at org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory.releaseExternalResources(NioServerSocketChannelFactory.java:162)
    at org.jboss.netty.bootstrap.Bootstrap.releaseExternalResources(Bootstrap.java:319)
    at com.googlecode.protobuf.pro.duplex.server.DuplexTcpServerBootstrap.releaseExternalResources(DuplexTcpServerBootstrap.java:132)
    at com.xxx.yyy.node.NodeServer$2.run(NodeServer.java:104)
    at java.lang.Thread.run(Thread.java:722)

这就是永不返回的关机钩子线程。下面是另一个似乎在等待频道的线程:

代码语言:javascript
复制
   java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.interrupt(Native Method)
    at sun.nio.ch.EPollArrayWrapper.interrupt(EPollArrayWrapper.java:274)
    at sun.nio.ch.EPollSelectorImpl.wakeup(EPollSelectorImpl.java:193)
    - locked <0x00000006b0896660> (a java.lang.Object)
    at java.nio.channels.spi.AbstractSelector$1.interrupt(AbstractSelector.java:210)
    at java.nio.channels.spi.AbstractSelector.begin(AbstractSelector.java:216)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:80)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
    - locked <0x00000006b08964a8> (a sun.nio.ch.Util$2)
    - locked <0x00000006b0896498> (a java.util.Collections$UnmodifiableSet)
    - locked <0x00000006b0890d20> (a sun.nio.ch.EPollSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
    at org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:52)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:208)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:38)
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

我在Linux上使用Netty 3.4.6.Linux和Java7.04。谢谢!

比尔弗兰克。

EN

回答 2

Stack Overflow用户

发布于 2012-08-04 10:47:33

裸Netty客户机/服务器也有同样的“问题”。

问题是,关闭服务器通道并不会关闭为接受的客户端连接创建的开放通道。必须显式地跟踪服务器中的客户端通道。这可以通过通道组和将客户端通道添加到该组的处理程序来完成。当涉及到关闭服务器时,组中的所有通道都应该以批处理的方式关闭,而不仅仅是一个服务器通道(也可以放入通道组)。

在用户指南(9.关闭您的应用程序):http://static.netty.io/3.5/guide/和ChannelGroup API文档(使用ChannelGroup简化关闭过程):http://static.netty.io/3.5/api/org/jboss/netty/channel/group/ChannelGroup.html中有很好的文档

票数 4
EN

Stack Overflow用户

发布于 2012-06-07 10:49:48

Netty服务器关机

  1. 关闭服务器通道
  2. 关机老板和工人执行器
  3. 发布服务器引导资源

示例代码

代码语言:javascript
复制
ChannelFuture cf = serverChannel.close();
cf.awaitUninterruptibly();
bossExecutor.shutdown();
workerExecutor.shutdown();
thriftServer.releaseExternalResources();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10911988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档