Состояние гонки в весенней сессии подписки на сеанс websocket - PullRequest
0 голосов
/ 18 мая 2019

В моем приложении чата я использую 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

Но один из пользователей должен быть другим.

...