Java Websocket服务器:处理每个会话的关闭事件
是否有方法处理每个会话的websocket的服务器端关闭事件?这就是我目前实施它的方式:Java Websocket服务器:处理每个会话的关闭事件,java,jakarta-ee,websocket,Java,Jakarta Ee,Websocket,是否有方法处理每个会话的websocket的服务器端关闭事件?这就是我目前实施它的方式: @ServerEndpoint("/ws") public class WebsocketServerEndpoint { @OnOpen public void onOpen(Session session) { System.out.println("Websocket opened"); CustomWebsocketHandler handler =
@ServerEndpoint("/ws")
public class WebsocketServerEndpoint {
@OnOpen
public void onOpen(Session session) {
System.out.println("Websocket opened");
CustomWebsocketHandler handler = new CustomWebsocketHandler(session); // see below
// ...
}
@OnClose
public void onClose(Session session, CloseReason reason) {
System.out.println("Websocket closed. Reason: " + reason);
}
}
但我想将新的会话
实例包装到自定义对象中。对于消息,我可以通过addMessageHandler
将处理程序直接添加到特定会话中。但是如何在该特定会话上为onClose
事件添加处理程序
class CustomWebsocketHandler {
public CustomWebsocketHandler(Session session) {
session.addMessageHandler((MessageHandler.Whole<String>) this::handleMessage);
// How to hook up close event to handleClose()?
}
private void handleMessage(String message) { /* ... */ }
private void handleClose() { /* ... */ }
}
在客户端,这很容易,因为每个连接都可以使用自己的ClientEndpoint
-注释类实例:
webSocketContainer.connectToServer(endpointInstance, websocketURI);
服务器端是否存在类似的情况,或者是否可以干净地处理每个会话的服务器端
onClose
(最终也是onError
)事件?默认情况下,为每个新客户端创建ServerEndpoint
注释类的新实例。此行为由以下方法控制:
此方法的平台默认实现在每次调用时返回一个新的端点实例,从而确保每个客户端都有一个端点实例,即默认部署基数
这意味着在WebsocketServerEndpoint
类本身中存储特定于会话的状态是安全的,而无需手动将会话与自定义连接实例关联:
@ServerEndpoint("/ws")
public class WebsocketServerEndpoint {
private CustomWebsocketHandler handler;
@OnOpen
public void onOpen(Session session) {
handler = new CustomWebsocketHandler(session);
}
@OnClose
public void onClose(Session session, CloseReason reason) {
handler.handleClose();
}
}
在这一点上,可能更容易让注释类
WebsocketServerEndpoint
成为所需的CustomWebsocketHandler
本身,因为它具有相同的语义:每个连接一个实例并处理websocket事件。默认情况下,为每个新客户端创建一个带注释类的新实例。此行为由以下方法控制:
此方法的平台默认实现在每次调用时返回一个新的端点实例,从而确保每个客户端都有一个端点实例,即默认部署基数
这意味着在WebsocketServerEndpoint
类本身中存储特定于会话的状态是安全的,而无需手动将会话与自定义连接实例关联:
@ServerEndpoint("/ws")
public class WebsocketServerEndpoint {
private CustomWebsocketHandler handler;
@OnOpen
public void onOpen(Session session) {
handler = new CustomWebsocketHandler(session);
}
@OnClose
public void onClose(Session session, CloseReason reason) {
handler.handleClose();
}
}
在这一点上,可能更容易让注释类WebsocketServerEndpoint
成为所需的CustomWebsocketHandler
本身,因为它具有相同的语义:每个连接一个实例并处理websocket事件