Stomp WebSocket订阅了两个不同的主题

时间:2018-04-01 21:13:46

标签: spring-boot websocket stomp

我在Java中有一个websocket服务器和一个websocket客户端。 websocket服务器有这个:

@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(final HelloMessage message) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new Greeting("Hello, " + message.getName() + "!");
}

在Java WebSocket客户端中,我在StompSessionHandler.afterConnected中有以下内容:

session.subscribe("/topic/greetings", stompFrameHandler)

然后,我能够在两者之间进行通信,客户端向服务器路径发送消息“hello”,然后由于客户端订阅了“主题/问候”,我也要用我的处理响应stompFrameHandler。

但我想知道客户是否有可能订阅两个不同的“频道”,所以在StompSessionHandler.afterConnected中这样的事情:

session.subscribe("/topic/greetings", greetingsFrameHandler)
session.subscribe("/topic/farewell", farewellFrameHandler)

因为我尝试了,我只能接收来自主题/问候的事件,但不能接收主题/告别事件。我不知道这是否重要,但为了触发告别事件,我会对websocket服务器进行休息调用:

@PostMapping(value = "/sendFarewellEvent", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@SendTo("/topic/farewell")
public Farewell farewell(@RequestBody final Farewell farewell) throws Exception {
    Thread.sleep(1000); // simulated delay
    return farewell;
}

1 个答案:

答案 0 :(得分:1)

  

我想知道客户端是否可以订阅两个不同的“频道”

是的,可以。

  

要触发告别事件,我对websocket服务器进行了休息呼叫

仅将@PostMapping@SendTo组合在一起无效,如您所愿。 @PostMappingorg.springframework.servlet.*)的处理程序与处理@MessageMappingorg.springframework.messaging.*)的处理程序不同,并且不以任何特殊方式处理@SendTo注释。

您可能要使用SimpMessagingTemplate来显式发送消息:How to call @SendTo from Normal Request Call i.e @RequestMapping