세션 당 websocket의 서버 측 닫기 이벤트를 처리 할 수있는 방법이 있습니까? 이것은 내가 현재 그것을 구현하는 방법입니다Websocket 서버 : 세션 당 닫기 이벤트 처리
@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);
}
}
하지만 사용자 지정 개체 내에서 새로운 Session
인스턴스를 마무리하고자합니다. 메시지의 경우 처리기를 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() { /* ... */ }
}
하나의 아이디어는 모든 WebsocketServerEndpoint
에서 세션 각각의 CustomWebsocketHandler
인스턴스를 추적하고, 모든 닫기 - 그들을 통해 이동했다 이벤트, 전달 이벤트. 그러나 이것은 매우 복잡하고 쉬운 오류 느낌 :
webSocketContainer.connectToServer(endpointInstance, websocketURI);
합니까 : 각 연결은 ClientEndpoint
-annotated 클래스의 자체 인스턴스를 사용할 수 있기 때문에,이 쉬운 사물의 클라이언트 측에서
@ServerEndpoint("/ws")
public class WebsocketServerEndpoint {
private List<Pair<Session, CustomWebsocketHandler>> sessions = new ArrayList<>();
@OnOpen
public void onOpen(Session session) {
// ...
sessions.add(Pair.of(session, handler)); // not hashable I suppose
}
@OnClose
public void onClose(Session session, CloseReason reason) {
// ...
for (Iterator<Pair<Session, CustomWebsocketHandler>> it = sessions.iterator(); it.hasNext();) {
Pair<Session, CustomWebsocketHandler> pair = it.next();
if (pair.getLeft() == session) {
pair.getRight().handleClose();
it.remove();
break;
}
}
}
}
을 서버 쪽에서 비슷한 것이 있거나 서버 당 onClose
(그리고 역시 onError
) 이벤트를 세션별로 처리하는 것이 깔끔하게 가능합니까?