簡體   English   中英

主要方法未在Jetty Websocket連接中退出

[英]Main method not exiting in Jetty Websocket connection

當我建立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) onError()

在此處輸入圖片說明

WebSocketClient視為瀏覽器。

您啟動它,然后發出許多請求,不同的選項卡等。

完成后,關閉瀏覽器。

如果不關閉瀏覽器,則瀏覽器仍在使用計算機上的資源。

當您使用WebSocketClient.start() ,會分配大量的資源,但是在示例代碼中,您永遠都不會stop()

我建議您做的是,在main()方法中應正確管理WebSocketClient的生命周期。

讓它創建WebSocketClient ,對其進行配置,然后對其進行start()

然后根據需要建立/建立盡可能多的websocket連接。

完成后,您必須使用WebSocketClient.stop()結束WebSocketClient生命周期(並清理分配的線程,線程池,執行程序,連接池,ssl引擎/ ssl上下文,緩沖池等)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM