Stomp WebSocket 订阅两个不同的主题

Stomp WebSocket subscribe to two different topics

我在 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" 发送消息来在两者之间进行通信,然后由于客户端订阅了 "topic/greetings",我也将处理我的 stompFrameHandler 的响应。

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

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

因为我试过了,我只能接收来自 topic/greetings 的事件,但不能接收来自 topic/farewell 的事件。我不知道这是否重要,但为了触发告别事件,我对 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;
}

I am wondering if it is possible for a client to subscribe to two different "channels"

是的,行得通。

to trigger a farewell event I make a rest call to the websocket server

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

您可能希望使用 SimpMessagingTemplate 明确发送消息: