tyrus websocket connectToServer - 如何清理守护线程

Posted

技术标签:

【中文标题】tyrus websocket connectToServer - 如何清理守护线程【英文标题】:tyrus websocket connectToServer - how to clean up daemon threads 【发布时间】:2013-10-09 14:01:20 【问题描述】:

tyrus websockets ClientManager connectToServer '未收到握手响应'

如何在不创建越来越多的守护进程和灰熊内核和灰熊工作线程的情况下重试连接。 是否有调用 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 
    

【问题讨论】:

【参考方案1】:

client.connectToServer 返回 Session 实例,当您调用 Session.close() 时,应关闭客户端运行时(没有剩余线程)。

您没有指定您使用的 Tyrus 版本(我推荐 1.3.3,我们在这方面做了一些改进)。此外,您可能对我们的共享容器支持感兴趣,请参阅TYRUS-275。您可以将它与Thread pool config 结合使用,您应该可以更好地控制产生/运行的线程数。

我们一直在寻找新的用例,因此,如果您认为自己的某些功能应该在 Tyrus 中得到更好的支持,请随时在我们的 JIRA 上创建新的增强请求。

【讨论】:

【参考方案2】:

我得到了完全相同的行为。我使用了很多线程和同步,并设法意外地获得了导致握手超时的 ClientEndpoint 阻塞的 onOpen 方法。

【讨论】:

以上是关于tyrus websocket connectToServer - 如何清理守护线程的主要内容,如果未能解决你的问题,请参考以下文章

tyrus websocket ssl 握手失败

使用 Tyrus javax.websocket 的 Java Websocket 客户端?

Tyrus websocket:IllegalStateException 无法为非异步请求设置 WriteListener

如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS

如何使用 Tyrus java 客户端在初始 WebSocket 客户端请求中包含 cookie?

tyrus websocket connectToServer - 如何清理守护线程