Spring websocket:如何发送给除消息发送者之外的所有订阅者
Spring websocket: how to send to all subscribers except the message sender
我在此处遵循 Spring websocket 与 sockJs 和 Stomp 的快速入门指南:
https://spring.io/guides/gs/messaging-stomp-websocket/
在这一点上,我的代码看起来像指南中的代码并且按预期工作。我有一个控制器 class,它有一个方法可以接受传入的消息并将它们发送回所有订阅该主题的人。
我想做的是更改代码,所以我的 @MessageMapping
注释方法向所有订阅者发送响应 不包括首先向控制器发送消息的订阅者(因为发件人也订阅了同一主题,但我不希望发件人继续接收它自己发送的消息,我猜这是一种循环)。
我看过许多描述如何向单个订阅者发送消息的文档,但还没有看到描述如何发送给除了一个订阅者之外的所有订阅者的文档 - 初始消息发送者。
在 Spring websocket 中是否有任何内置方法可以轻松做到这一点?
好的,我已经设法找到了一些目前对我有用的解决方案:
我能够按主要用户名过滤订阅者。
我得到了所有简单的用户表单 org.springframework.messaging.simp.user.SimpUserRegistry
,
和来自 org.springframework.messaging.simp.stomp.StompHeaderAccessor
.
的当前发件人
我的代码看起来像这样:
@MessageMapping("/game/doStuff")
public void gameGrid(DoStuffMessage doStuffMessage,
StompHeaderAccessor headers) {
sendTo("/game/doStuff", doStuffMessage, headers);
}
private void sendTo(String destination, Object payload, StompHeaderAccessor headers) {
Optional<String> user = Optional.ofNullable(headers.getUser())
.map(Principal::getName);
if (user.isPresent()) {
List<String> subscribers = simpUserRegistry.getUsers().stream()
.map(SimpUser::getName)
.filter(name -> !user.get().equals(name))
.collect(Collectors.toList());
subscribers
.forEach(sub -> simpMessagingTemplate.convertAndSendToUser(sub, destination, payload));
}
}
客户正在订阅 /user/game/doStuff
目前有效。我担心的是这段代码是否可以水平扩展 - 如果有人对此有任何见解,我将不胜感激。
我在此处遵循 Spring websocket 与 sockJs 和 Stomp 的快速入门指南: https://spring.io/guides/gs/messaging-stomp-websocket/
在这一点上,我的代码看起来像指南中的代码并且按预期工作。我有一个控制器 class,它有一个方法可以接受传入的消息并将它们发送回所有订阅该主题的人。
我想做的是更改代码,所以我的 @MessageMapping
注释方法向所有订阅者发送响应 不包括首先向控制器发送消息的订阅者(因为发件人也订阅了同一主题,但我不希望发件人继续接收它自己发送的消息,我猜这是一种循环)。
我看过许多描述如何向单个订阅者发送消息的文档,但还没有看到描述如何发送给除了一个订阅者之外的所有订阅者的文档 - 初始消息发送者。
在 Spring websocket 中是否有任何内置方法可以轻松做到这一点?
好的,我已经设法找到了一些目前对我有用的解决方案:
我能够按主要用户名过滤订阅者。
我得到了所有简单的用户表单 org.springframework.messaging.simp.user.SimpUserRegistry
,
和来自 org.springframework.messaging.simp.stomp.StompHeaderAccessor
.
我的代码看起来像这样:
@MessageMapping("/game/doStuff")
public void gameGrid(DoStuffMessage doStuffMessage,
StompHeaderAccessor headers) {
sendTo("/game/doStuff", doStuffMessage, headers);
}
private void sendTo(String destination, Object payload, StompHeaderAccessor headers) {
Optional<String> user = Optional.ofNullable(headers.getUser())
.map(Principal::getName);
if (user.isPresent()) {
List<String> subscribers = simpUserRegistry.getUsers().stream()
.map(SimpUser::getName)
.filter(name -> !user.get().equals(name))
.collect(Collectors.toList());
subscribers
.forEach(sub -> simpMessagingTemplate.convertAndSendToUser(sub, destination, payload));
}
}
客户正在订阅 /user/game/doStuff
目前有效。我担心的是这段代码是否可以水平扩展 - 如果有人对此有任何见解,我将不胜感激。