我正在使用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 按钮,客户端像这样挂起,但它没有检测到任何东西(不确定是否会,但我想我会提到它)。