gpt4 book ai didi

netty - 客户端连接打开时关闭 Netty 服务器

转载 作者:行者123 更新时间:2023-12-05 00:34:16 26 4
gpt4 key购买 nike

我正在尝试关闭与它建立连接的 Netty 服务器,但它只是挂起。这就是我所做的。

  • 在一台机器上启动服务器,在另一台机器上启动客户端。
  • 从客户端向服务器发送一条消息,我得到响应。
  • 使用 Ctrl-C
  • 关闭服务器

    我已经在服务器上注册了一个关闭钩子(Hook),它关闭 ChannelGroup 并在 ServerBootstrap 上调用 releaseExternalResources(或者实际上我正在使用 protobuf-pro-duplex 库的 DuplexTcpServerBootstrap 来执行此操作)。无论如何,关闭钩子(Hook)在关闭时被正确调用,但它永远不会返回。当我对正在发生的事情进行线程转储时,我可以看到两个有趣的堆栈:
       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)

    所以这是永远不会返回的关闭钩子(Hook)线程。下面是另一个似乎正在等待 channel 的线程:
       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.Final 和 Java 7.04。谢谢!

    溴,
    坦率。

    最佳答案

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

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

    用户指南中有很好的文档(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

    关于netty - 客户端连接打开时关闭 Netty 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10911988/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com