当我建立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());
}
}
}
输出为 :(不建议添加图片,但给出实际问题)
在下图中可以看到,即使未建立连接,主线程也不会退出。如何终止?我在System.exit(0)
和Runtime.getRuntime().exit(0)
中尝试了onClose()
或onError()
。
答案 0 :(得分:0)
以WebSocketClient
为浏览器。
您启动它,然后发出许多请求,使用不同的标签等。
完成后,关闭浏览器。
如果不关闭浏览器,则浏览器仍在使用机器上的资源。
当您WebSocketClient.start()
分配了全部资源时,但是在示例代码中,您永远不会stop()
。
我建议您做的是在您的main()
方法中,应该正确管理WebSocketClient
的生命周期。
已创建WebSocketClient
,对其进行配置,然后对其进行start()
。
然后根据需要建立/建立尽可能多的Websocket连接。
完成后,您必须使用WebSocketClient.stop()
来结束WebSocketClient
的生命周期(并清理分配的线程,线程池,执行程序,连接池,ssl引擎/ ssl上下文,缓冲池,等等