Stomp WebSocket 订阅两个不同的主题

Man*_*rte 3 stomp websocket spring-boot

我有一台 websocket 服务器和一个 websocket 客户端,都是用 Java 编写的。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() + "!");
}
Run Code Online (Sandbox Code Playgroud)

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

session.subscribe("/topic/greetings", stompFrameHandler)
Run Code Online (Sandbox Code Playgroud)

然后,我可以通过客户端向服务器路径“hello”发送消息来在两者之间进行通信,然后由于客户端订阅了“topic/greetings”,我还可以使用我的 stompFrameHandler 来处理响应。

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

session.subscribe("/topic/greetings", greetingsFrameHandler)
session.subscribe("/topic/farewell", farewellFrameHandler)
Run Code Online (Sandbox Code Playgroud)

因为我尝试过,只能接收主题/问候的事件,但不能接收主题/告别的事件。我不知道这是否重要,但为了触发告别事件,我对 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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*ete 5

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

是的,这有效。

为了触发告别事件,我对 websocket 服务器进行休息调用

仅仅结合@PostMapping@SendTo 不能如您所愿。@PostMapping( )的处理程序与处理( )org.springframework.servlet.*的处理程序不同,并且不以任何特殊方式处理注释。@MessageMappingorg.springframework.messaging.*@SendTo

您可能想使用SimpMessagingTemplate显式发送消息:How to call @SendTo from Normal Request Call ie @RequestMapping