我在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;
}
答案 0 :(得分:1)
我想知道客户端是否可以订阅两个不同的“频道”
是的,可以。
要触发告别事件,我对websocket服务器进行了休息呼叫
仅将@PostMapping
与@SendTo
组合在一起无效,如您所愿。 @PostMapping
(org.springframework.servlet.*
)的处理程序与处理@MessageMapping
(org.springframework.messaging.*
)的处理程序不同,并且不以任何特殊方式处理@SendTo
注释。
您可能要使用SimpMessagingTemplate
来显式发送消息:How to call @SendTo from Normal Request Call i.e @RequestMapping