В моем приложении чата я использую spring (websocket) на сервере и подключаюсь к нему через sockjs из моего углового приложения.Всегда, если я обновляю angular (ctrl-s) (у меня открыты 2 отдельных окна браузера, вошли в систему с разными пользователями), в методе @EventListener «handleSubscribeEvent» возникает состояние гонки.Событие запускается от одного и того же пользователя дважды, вместо обоих пользователей.Несмотря на то, что идентификаторы сессии в методе рукопожатия различны.
Почему это происходит?
Метод сопоставления в WebSocketController.java:
@MessageMapping("/messages")
public void sendToSpecificUser(@Payload String receiver) {
this.template.convertAndSendToUser(receiver, "/chat/messages", "");
}
@EventListener
public void handleSubscribeEvent(SessionSubscribeEvent event) {
System.out.println("<===> SUBSCRIBE - EVENT");
System.out.println("username: " + event.getUser().getName());
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
System.out.println("sessionId: " + headerAccessor.getSessionAttributes().get("sessionId").toString());
}
Соединение Websocket через SockJS:
const socket = new SockJS("http://localhost:8080/socket");
this.stompClient = Stomp.over(socket);
const that = this
this.stompClient.connect({}, () => {
that.stompClient.subscribe("/user/chat/messages", () => {
// If a new message is received, then update the view
that.ngOnInit()
});
});
Отправитьсообщение:
this.stompClient.send(`/chat/messages`, {}, this.receiver);
Я ожидаю, что имя пользователя события - это пользователь, который подписывается на веб-сокет, но на самом деле имя пользователя, который подписывается, является одним из двух моих пользователей.Вот вывод на стороне сервера, если я обновлю угловое приложение.
---- ПОЛУЧЕНО НОВОЕ СОЕДИНЕНИЕ ----
<===> ПОДПИСАТЬСЯ - СОБЫТИЕ
имя пользователя: john-doe
sessionId: 4E5EB52635C72B692A2637D760E1162B
---- ПОЛУЧЕНО НОВОЕ СОЕДИНЕНИЕ ----
<===> ПОДПИСАТЬСЯ - СОБЫТИЕ
username: john-doe <- здесь должен быть другой пользователь для ex.john-snow <br>sessionId: 750C516ABB12BEEC89708BC0DF43D1F4
Но один из пользователей должен быть другим.