2

我正在使用tyrus-standalone-client-1.12.jar来维护与我无法控制的 Websocket 服务器(或一组服务器)的连接。我正在创建一个ClientManager我配置然后使用的实例clientManager.asyncConnectToServer(this, new URI(server)),其中this带有注释方法的类的实例在哪里@OnOpen@OnMessage等等。

我也有一个ClientManager.ReconnectHandler注册,它处理onDisconnect并且onConnectFailure当然输出调试消息。

大多数时候它连接得很好,但特别是当服务器出现问题并且我失去连接时,重新连接有时不起作用。

true当我刚返回时,我第一次注意到它,onDisconnect有时它只是不会重新连接(在这种情况下,它ReconnectHandler应该为我完成,它通常也会这样做)。程序的其余部分继续运行良好,但我的 websocket 客户端在onDisconnect.

从那以后,我将其更改为仅使用(延迟)ReconnectHandler再次连接asyncConnectToServer,以便能够切换到另一台服务器(我无法找到仅使用 的方法ReconnectHandler)。即使那样,asyncConnectToServer有时只是似乎什么也没做。我确信它会做一些事情,但它不会输出调试消息,onConnectFailure也不会调用onOpen,即使是在几个小时后,所以客户端最终只是被卡在那里。

同样,情况并非总是如此。它可以重新连接好几次,都由onDisconnect或触发onConnectFailure,然后一次尝试突然挂起。当我同时运行程序的两个实例时,都重新连接了几次,然后都asyncConnectToServer在相同的重新连接尝试中挂起,这对我来说似乎表明它是由服务器或连接的某些状态引起的。

有一次它甚至在最初连接(未重新连接)时连接失败,同时服务器似乎有问题。

  • 有谁知道可能导致这种情况的原因?
  • 我是否缺少一些属性来设置连接尝试超时?
  • 我是否缺少某种方法来检索连接失败信息ReconnectHandler.onConnectFailure
  • 我什至可以重复使用相同ClientManager的连接多次(在前一个连接关闭之后)?
  • 我的客户端端点实现中是否有某些东西以某种方式阻止onOpen或被onConnectFailure调用?

在没有收到任何错误消息并且无法重现它的情况下,很难说出发生了什么。我在程序上使用了 JConsole 的 Detect Deadlock 按钮,客户端像这样挂起,但它没有检测到任何东西(不确定是否会,但我想我会提到它)。

4

0 回答 0