Основной метод, не выходящий из соединения Jetty Websocket - PullRequest
0 голосов
/ 08 февраля 2019

Когда я устанавливаю соединение Websocket, устанавливаю соединение, но после закрытия соединения или какой-либо ошибки в соединении основной поток не прерывается, я могу видеть только режим работы JVM.После отправки событий сервером веб-сокетов это соединение не получает никаких уведомлений. Как только подключение к веб-сокету отключено от сервера, он не подключается и не выходит .

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());
   }
  }
}

Вывод :( Добавление изображения не рекомендуется, но дает актуальную проблему) На изображении нижеможет видеть все еще Главный поток не завершается, даже если соединение не установлено.как прекратить?Я пытался System.exit(0) или Runtime.getRuntime().exit(0) в onClose() & onError().

enter image description here

1 Ответ

0 голосов
/ 08 февраля 2019

Думайте о WebSocketClient как о браузере.

Вы запускаете его, а затем делаете много запросов, различные вкладки и т. Д.

Когда вы закончите, вы закроете браузер.

Если вы не закрываете браузер, браузер все еще использует ресурсы на вашем компьютере.

Когда вы WebSocketClient.start() выделяете целый хост ресурсов, но в вашем примере кода выникогда stop().

То, что я рекомендую вам сделать, заключается в том, что ваш main() метод должен правильно управлять жизненным циклом WebSocketClient.

Создайте WebSocketClient, настройтеit, а затем start() it.

Затем создайте / установите столько соединений websocket, сколько вы хотите.

Когда вы закончите, вы должны использовать WebSocketClient.stop(), чтобы завершить WebSocketClient жизненный цикл (и очистка выделенных потоков, пула потоков, исполнителя, пулов соединений, контекстов ssl engine / ssl, буферных пулов и т. д.)

...