Jetty Websocket连接中未退出的主要方法

Posted

技术标签:

【中文标题】Jetty Websocket连接中未退出的主要方法【英文标题】:Main method not exiting in Jetty Websocket connection 【发布时间】:2019-02-08 05:58:39 【问题描述】:

当我建立Websocket连接时,连接建立但在关闭连接或连接发生任何错误后,主线程没有被杀死,我只能看到JVM运行模式。 websocket 服务器发送事件后,此连接未收到任何通知。 一旦 websocket 与服务器断开连接,既不重新连接也不退出

WebsocketClientEndpoint.java

import java.net.URI;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WebsocketClientEndpoint 

  private static Logger LOGGER = LoggerFactory.getLogger(WebsocketClientEndpoint.class);

    public void establishConnection(MessageHandler soket, String url, String token) 
    WebSocketClient client = new WebSocketClient();
    try 
      client.start();
      client.setMaxIdleTimeout(0);
      URI wsURI = new URI(url);
      ClientUpgradeRequest request = new ClientUpgradeRequest();
      if(StringUtils.isNotBlank(token)) 
        request.setHeader("Authorization", token);
      
      client.connect(soket, wsURI, request);
      LOGGER.info("Connecting to :" + wsURI);
     catch (Throwable e) 
      LOGGER.error(e.getMessage(), e);
    

    LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>");
    


MessageHandler.java

import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@WebSocket
public class MessageHandler 

  private static Logger LOGGER = LoggerFactory.getLogger(MessageHandler.class);
  private Session session;

  public void handleMessage(String message) 
    LOGGER.info("Message>>>>>>>>>>>" + message);
  

  @OnWebSocketClose
  public void onClose(int statusCode, String reason) 
    this.session.close();
    LOGGER.info("connection closing");
    LOGGER.info("" + statusCode);
    LOGGER.info(reason);
  

  @OnWebSocketConnect
  public void onConnect(Session session) 
    this.session = session;
    LOGGER.info("Connection Established");
  

  @OnWebSocketError
  public void onError(Session session, Throwable throwable) 
    LOGGER.error("error:" + throwable.getMessage());

    if(session != null)
      session.close();
  

  @OnWebSocketMessage
  public void onMessage(String msg) 
    LOGGER.info("Message Received : " + msg);
  


TestApp.java

public class TestApp 

  public static void main(String[] args) 
   try 
     System.out.println("\n\n==================================== Start ==============================================\n\n");
     MessageHandler soket = new MessageHandler();
     WebsocketClientEndpoint clientEndPoint = new WebsocketClientEndpoint();
     clientEndPoint.establishConnection(soket, "ws://localhost:5566/java-websocket/sample", null);
     System.out.println("\n\n==================================== End ==============================================\n\n");
    catch (Exception ex) 
     System.err.println("URISyntaxException exception: " + ex.getMessage());
   
  

输出是:(不建议添加图像,但会给出实际问题) 在下图中可以看到即使没有建立连接,主线程也没有退出。如何终止?我在onClose()&onError() 中尝试了System.exit(0)Runtime.getRuntime().exit(0)

【问题讨论】:

【参考方案1】:

WebSocketClient 视为浏览器。

您启动它,然后发出许多请求、不同的选项卡等。

完成后,关闭浏览器。

如果你不关闭浏览器,浏览器仍在使用你机器上的资源。

当你 WebSocketClient.start() 分配了一大堆资源,但在你的示例代码中,你永远不会 stop()

我建议你做的是,在你的 main() 方法中应该正确管理 WebSocketClient 的生命周期。

让它创建WebSocketClient,配置它,然后start() 它。

然后根据需要建立/建立尽可能多的 websocket 连接。

完成后,您必须使用WebSocketClient.stop() 来结束WebSocketClient 生命周期(并清理分配的线程、线程池、执行程序、连接池、ssl 引擎/ssl 上下文、缓冲池等)

【讨论】:

以上是关于Jetty Websocket连接中未退出的主要方法的主要内容,如果未能解决你的问题,请参考以下文章

jetty 9,websockets 和关闭服务器端的 websocket 连接

Jetty Websocket 连接 - 忽略自签名证书

Jetty 9.2.x Websocket Server连接在使用Firefox而不是Chrome时连接后自动关闭

Jetty Websocket 服务器在本地工作,但远程连接失败并出现“主机已关闭”错误,如何解决?

Jetty WebSocket 代理

让 Jetty Websocket 使用与 JavaScript Websocket 相同的语言