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