春季Websocket会话订阅活动中的比赛条件

时间:2019-05-18 11:16:59

标签: spring session events websocket subscribe

在我的聊天应用程序中,我在服务器上使用spring(websocket),并通过我的角度应用程序通过sockjs连接到它。总是如果我刷新有角的(ctrl-s)(我打开了2个单独的浏览器窗口,并以不同的用户身份登录),@ EventListener方法“ handleSubscribeEvent”中就会发生竞争。从同一用户(而不是两个用户)两次触发该事件。尽管会话ID在握手方法中有所不同。

为什么会这样?

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());
}

通过SockJS的Websocket连接:

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);

我希望事件的用户名是订阅websocket的用户,但实际上,订阅的用户名是我的两个用户之一。如果刷新角度应用程序,则这是服务器端的输出。

----接收到新连接----
<===>订阅-事件
用户名: john-doe
sessionId: 4E5EB52635C72B692A2637D760E1162B

----接收到新连接----
<===>订阅-事件
用户名: john-doe <-这里应该是ex的另一个用户。约翰·斯诺
sessionId: 750C516ABB12BEEC89708BC0DF43D1F4

但是其中一个用户应该是另一个。

0 个答案:

没有答案