Solución:
los WebSocketHandler
afterConnectionClosed
se llama a la función después de que un cliente websocket se desconecta. Simplemente necesita anular esto de la manera en que anula handleTextMessage
.
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus){
// your code here
}
Puede haber una demora sustancial entre la desconexión del cliente y la detección de eventos del servidor. Consulte los detalles sobre la detección de desconexiones en tiempo real.
Deberá anular configureClientOutboundChannel y configureClientInboundChannel de AbstractWebSocketMessageBrokerConfigurer, proporcionando su interceptor
Otra forma es usar ApplicationEvents.
Ambos métodos se describen aquí: http://www.sergialmar.com/2014/03/detect-websocket-connects-and-disconnects-in-spring-4/
public class StompConnectEvent implements ApplicationListener<SessionConnectEvent> {
private final Log logger = LogFactory.getLog(StompConnectEvent.class);
public void onApplicationEvent(SessionConnectEvent event) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
String company = sha.getNativeHeader("company").get(0);
logger.debug("Connect event [sessionId: " + sha.getSessionId() +"; company: "+ company + " ]");
}
}
Espero que te ayude. Avísame si necesito explicarte más.
Puede utilizar oyentes para detectar cuándo la sesión está conectada o cerrada. Puede encontrar más información sobre los oyentes en este enlace.
Ejemplo de cómo detectar una sesión conectada:
@Component
public class SessionConnectedEventListener implements ApplicationListener<SessionConnectedEvent> {
private IWebSocketSessionService webSocketSessionService;
public SessionConnectedEventListener(IWebSocketSessionService webSocketSessionService) {
this.webSocketSessionService = webSocketSessionService;
}
@Override
public void onApplicationEvent(SessionConnectedEvent event) {
webSocketSessionService.saveSession(event);
}
}
Ejemplo de cómo detectar cuando la sesión está desconectada:
@Component
public class SessionDisconnectEventListener implements ApplicationListener<SessionDisconnectEvent> {
private IWebSocketSessionService webSocketSessionService;
public SessionDisconnectEventListener(IWebSocketSessionService webSocketSessionService) {
this.webSocketSessionService = webSocketSessionService;
}
@Override
public void onApplicationEvent(SessionDisconnectEvent event) {
webSocketSessionService.removeSession(event);
}
}