启用客户端共享容器时,Tyrus客户端无法在服务器重新启动时重新连接

时间:2015-08-01 01:40:51

标签: java websocket grizzly tyrus

以下是该方案:

  1. Websocket服务器已启动
  2. 已启用Tyrus客户端共享容器
  3. Tyrus客户端连接到服务器(一切都很好)
  4. Websocket服务器重启
  5. 即使在服务器启动后,Tyrus客户端也无法连接到服务器并引发以下异常:
  6. javax.websocket.DeploymentException: Connection failed

    1. 如果重新启动客户端应用程序,则可以再次连接到服务器
    2. 注意:如果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来自灰熊项目文件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

1 个答案:

答案 0 :(得分:0)

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