tyrus websockets ClientManager connectToServer'未收到握手响应'
如何在没有创建越来越多的守护进程和Grizzly内核以及Grizzly-worker线程的情况下重试连接。 是否有调用Session或客户端来杀死/清除 Thread-1到4以及Grizzly-kernel和Grizzly-worker线程?
示例JAVA主线,它试图永久地建立和维护与服务器的连接,该服务器可能没有运行或定期重启。
public void onClose(Session session, CloseReason closeReason) {
latch.countDown();
}
enter code here
public static void main(String[] args) {
while (true) {
latch = new CountDownLatch(1);
ClientManager client = ClientManager.createClient();
try {
client.connectToServer(wsListener.class, new URI("wss://<host>/ws"));
latch.await();
}
catch (DeploymentException e) {
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
break;
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
client = null;
latch = null;
// HERE... clean up
}
}
答案 0 :(得分:1)
client.connectToServer返回Session实例,当您调用Session.close()时,应关闭客户端运行时(不剩任何线程)。
你没有指定你正在使用的Tyrus版本(我推荐1.3.3,我们在这方面做了一些改进)。您也可能对我们的共享容器支持感兴趣,请参阅TYRUS-275。您可以将它与Thread pool config结合使用,您应该可以更好地控制生成/运行的线程数。
我们一直在寻找新的用例,因此如果您认为Tyrus应该更好地支持某些内容,请随时在JIRA上创建新的增强请求。
答案 1 :(得分:0)
我有完全相同的行为。我使用了很多线程和同步,并设法意外地获取ClientEndpoint阻塞的onOpen方法,这导致握手超时。