Spring Boot - Websockets - 如何查看订阅者

问题描述 投票:0回答:2

我正在开发一个 websocket 应用程序,我试图让一个 websocket 提供信息,然后输出给端点的订阅者。我已经弄清楚了,但我想知道是否有办法查看订阅者订阅了哪些订阅者以及订阅了哪些路径?

这是我正在处理的代码示例。

@Autowired
private SimpMessagingTemplate template;

@MessageMapping("/{companyId}/{departmentId}")
@SendTo("/{companyId}/{departmentId}")
public void companyInformation(@DestinationVariable String companyId, @DestinationVariable String departmentId, CompanyMessage companyMessage){

    String destination = "/" + companyId + "/" + departmentId;
    template.convertAndSend(
          destination, processCompanyMessage(companyMessage, departmentId));
}

其想法是,信息发布者将

companyMessage
对象发送到
@MessageMapping
端点,从该映射中检索
companyId
departmentId

然后根据

departmentId
的内容处理此消息,并将其发布到拥有
@SendTo
路径的活动订阅者的每个部门。

例如

有 3 个 websocket 订阅者,

/smallCompany/booking
/smallCompany/sales
/smallCompany/inventory

@MessageMapping
收到来自
/smallCompany/sales
的消息。该方法根据
departmentId
处理消息,并使用相同的
/{companyId}
发布给每个订阅者,即使
/{departmentId}
不同。

如果可能的话,任何想法,如果不可能,任何推动我朝正确方向前进的想法都很棒。

spring-boot websocket stomp
2个回答
9
投票

我知道现在回答已经太晚了!但我现在看到这个问题了! 因此,为了指导其他人看到这个问题,我应该说:

您有多种解决方案:

1-SimpUserRegistry:

@Autowired private SimpUserRegistry simpUserRegistry;

public Set<SimpUser> getUsers() { 
    return simpUserRegistry.getUsers();
}

检查此链接: 有 Spring WebSocketSession 存储库吗?

2- 全球列表:

您肯定已经在 Spring Boot 中配置了 Web-socket,因此,您可能有一个来自 WebSocketMessageBrokerConfigurer 的派生类,并覆盖 configureClientInboundChannel 来调用 setInterceptors...

您应该实现从 ChannelInterceptorAdapter 派生的自定义拦截器并重写 preSend 来访问 MessageHeaderAccessor.getAccessor(...).command
这些命令在 StompCommand 中定义(CONNECT、DISCONNECT、SUBSCRIBE、UNSUBSCRIBE,...)

通过使用 StompCommand.SUBSCRIBE/UNSUBSCRIBE 检查 accessor.command,您可以创建和同步订阅者的全局静态列表,并在您需要的任何地方使用它。

3-其他解决方案:

检查此链接:
如何使用 Spring 4 在我的 webSocket 服务器中捕获订阅事件


0
投票

第一种方法永远不会显示任何用户

© www.soinside.com 2019 - 2024. All rights reserved.