【问题标题】:netty client hangs on connectnetty 客户端在连接时挂起
【发布时间】:2016-05-24 09:11:53
【问题描述】:

我正在使用一个名为 Cloudhopper 的 SMPP 库,它在后台使用 netty 3.9.9 来连接到 SMPP 服务器。当连接断开时,我尝试重新连接。在大多数情况下,这可行,但有时重新连接会挂起。有问题的代码是(或参见https://github.com/twitter/cloudhopper-smpp/blob/master/src/main/java/com/cloudhopper/smpp/impl/DefaultSmppClient.java#L286):

// a socket address used to "bind" to the remote system
InetSocketAddress socketAddr = new InetSocketAddress(host, port);

// set the timeout
this.clientBootstrap.setOption("connectTimeoutMillis", connectTimeoutMillis);

// attempt to connect to the remote system
ChannelFuture connectFuture = this.clientBootstrap.connect(socketAddr);

connectFuture.awaitUninterruptibly();

clientBootstrap 每次都会被重用。一个线程转储看起来像这样:

"Sender Heartbeat 1" prio=10 tid=0x00007f0b50feb800 nid=0x7fa in Object.wait() [0x00007f0b849e2000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000000caa999b0> (a org.jboss.netty.channel.DefaultChannelFuture)
    at java.lang.Object.wait(Object.java:503)
    at org.jboss.netty.channel.DefaultChannelFuture.awaitUninterruptibly(DefaultChannelFuture.java:259)
    - locked <0x00000000caa999b0> (a org.jboss.netty.channel.DefaultChannelFuture)
    at com.cloudhopper.smpp.impl.DefaultSmppClient.createConnectedChannel(DefaultSmppClient.java:286)
    at com.cloudhopper.smpp.impl.DefaultSmppClient.doOpen(DefaultSmppClient.java:224)
    at com.cloudhopper.smpp.impl.DefaultSmppClient.bind(DefaultSmppClient.java:193)

有人没有向 DefaultChannelFuture 发送通知。有谁知道如何进一步调查它?是什么导致netty不发送通知?到目前为止我无法在本地重现它,所以我无法调试它。

我在 cloudhopper 库提交了一份错误报告,但我希望我能找到更多信息,甚至可能提供修复。

干杯 如文

干杯 如文

【问题讨论】:

    标签: netty deadlock


    【解决方案1】:

    我实际上设法通过以下解决方法解决了它(以防万一有人遇到同样的问题):

        if (!connectFuture.await(connectTimeoutMillis + 1000)) {
            logger.error("connectFuture did not finish in expected time! Try to cancel the connectFuture");
            boolean isCanceled = connectFuture.cancel();
            logger.error("connectFuture: isCanceled {} isDone {} isSuccess {}", isCanceled, connectFuture.isDone(), connectFuture.isSuccess());
            throw new SmppChannelConnectTimeoutException("Could not connect to the server within timeout");
        }
    

    鉴于 Netty 版本(3.9.6.Final)相当老,我没有在 Netty 项目中提交错误。但是我在 cloudhopper 项目中添加了一个 PR。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多