【问题标题】:Tyrus client cannot reconnect on server restart when client shared container is enabled启用客户端共享容器后,Tyrus 客户端无法在服务器重新启动时重新连接
【发布时间】:2015-10-23 19:03:51
【问题描述】:

这里是场景:

  1. Websocket 服务器已启动
  2. Tyrus 客户端共享容器已启用
  3. Tyrus 客户端连接到服务器(一切正常)
  4. Websocket 服务器重启
  5. Tyrus 客户端无法连接到服务器并在服务器启动后抛出以下异常:

javax.websocket.DeploymentException: Connection failed

  1. 如果客户端应用程序重新启动,它可以再次连接到服务器

注意:如果禁用Tyrus client shared container,则不会发生此问题。

堆栈跟踪:

javax.websocket.DeploymentException: Connection failed.
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket._connect(GrizzlyClientSocket.java:428) ~[tyrus-container-grizzly-client-1.11.jar:?]
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket.access$000(GrizzlyClientSocket.java:103) ~[tyrus-container-grizzly-client-1.11.jar:?]
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket$1.call(GrizzlyClientSocket.java:235) ~[tyrus-container-grizzly-client-1.11.jar:?]
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket$1.call(GrizzlyClientSocket.java:231) ~[tyrus-container-grizzly-client-1.11.jar:?]
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket.connect(GrizzlyClientSocket.java:249) ~[tyrus-container-grizzly-client-1.11.jar:?]
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientContainer.openClientSocket(GrizzlyClientContainer.java:95) ~[tyrus-container-grizzly-client-1.11.jar:?]
    at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:663) ~[tyrus-client-1.11.jar:?]
    at org.glassfish.tyrus.client.ClientManager$3.run(ClientManager.java:712) ~[tyrus-client-1.11.jar:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_31]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_31]
    at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:866) ~[tyrus-client-1.11.jar:?]
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) ~[?:1.8.0_31]
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:511) ~[tyrus-client-1.11.jar:?]
    at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:373) ~[tyrus-client-1.11.jar:?]
    ...
Caused by: java.lang.NullPointerException
    at org.glassfish.grizzly.nio.RoundRobinConnectionDistributor$SharedIterator.next(RoundRobinConnectionDistributor.java:146) ~[grizzly-framework-2.3.15-gfa.jar:2.3.15-gfa]
    at org.glassfish.grizzly.nio.RoundRobinConnectionDistributor.registerChannelAsync(RoundRobinConnectionDistributor.java:101) ~[grizzly-framework-2.3.15-gfa.jar:2.3.15-gfa]
    at org.glassfish.grizzly.nio.transport.TCPNIOConnectorHandler.connectAsync(TCPNIOConnectorHandler.java:177) ~[grizzly-framework-2.3.15-gfa.jar:2.3.15-gfa]
    at org.glassfish.grizzly.AbstractSocketConnectorHandler.connect(AbstractSocketConnectorHandler.java:91) ~[grizzly-framework-2.3.15-gfa.jar:2.3.15-gfa]
    at org.glassfish.grizzly.AbstractSocketConnectorHandler.connect(AbstractSocketConnectorHandler.java:79) ~[grizzly-framework-2.3.15-gfa.jar:2.3.15-gfa]
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket._connect(GrizzlyClientSocket.java:386) ~[tyrus-container-grizzly-client-1.11.jar:?]
    ... 41 more

NPE 来自 grizzly 项目文件 RoundRobinConnectionDistributor.java:146 中的 if (runners.length == 1) {

private final class SharedIterator implements Iterator {
private final AtomicInteger counter = new AtomicInteger();

@Override
public SelectorRunner next() {
    final SelectorRunner[] runners = getTransportSelectorRunners();
    if (runners.length == 1) {
        return runners[0];
    }

    return runners[(counter.getAndIncrement() & 0x7fffffff) % runners.length];
}

@Override
public SelectorRunner nextService() {
    return next();
}
}

看起来runnersnull

【问题讨论】:

  • 您是否在客户端和服务器之间共享相同的 Grizzly 传输?如果没有 - 您能否创建一个简单的基于 maven 的测试来重现问题?
  • @alexey,你能澄清一下你所说的“同样的灰熊交通工具”是什么意思吗?你的意思是如果两个客户端服务器都使用相同的 Grizzly 版本进行底层 websocket 连接?
  • 不完全是,您是否可以创建一个测试用例来重现问题(在 github 上?)?谢谢。
  • @alexey,看起来问题可能出在 Tyrus 代码中。我正在与 Tyrus 团队合作处理这个github.com/tyrus-project/tyrus/pull/170。我希望我有机会为此创建一个测试用例并将其发布在这里。

标签: java websocket grizzly tyrus


【解决方案1】:

对于任何对此感兴趣的人,此问题已由 pull requestTyrus 1.12 中修复。感谢@pavel 和他的团队采取行动 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2018-02-10
    • 2011-04-16
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2014-02-17
    • 2020-09-05
    相关资源
    最近更新 更多