我正在这里使用sockJs和Stomp遵循Spring websocket的快速入门指南:https://spring.io/guides/gs/messaging-stomp-websocket/
至此,我的代码看起来像是指南中的代码,并且可以正常工作。我有一个控制器类,该类具有接受传入消息并将其发送回订阅该主题的所有人员的方法。
我想做的是更改代码,所以我的@MessageMapping
带注释的方法将响应发送给所有订阅者不包括首先向控制器发送消息的人(因为发送者也是订阅了相同的主题,但是我不希望发件人继续接收它自己发送的消息,我想这是一个循环)。
[我看过许多文档,描述了如何向单个订阅者发送消息,但是对于描述如何向除初始消息发送者以外的所有对象发送消息,还没有见过。
在Spring websocket中,有没有内置的方法可以轻松地做到这一点?
好,所以我设法找到了一些适合我的解决方案:
i能够按主要用户名筛选订户。
我从org.springframework.messaging.simp.user.SimpUserRegistry
获得了所有简单用户,和来自org.springframework.messaging.simp.stomp.StompHeaderAccessor
的当前发件人。
我的代码看起来像这样:
@MessageMapping("/game/doStuff")
public void gameGrid(MoveCardToSlotAction moveCardToSlotAction,
StompHeaderAccessor headers) {
sendTo("/game/doStuff", moveCardToSlotAction, 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
目前有效。我担心的是此代码是否可以水平扩展-如果有人对此有任何见解,我将不胜感激。