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



我正在开发一个 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));
}

这个想法是信息海报将对象发送到@MessageMapping终结点companyMessage,从此映射中检索companyIddepartmentId

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

例如

有 3 个网络插座订阅者,/smallCompany/booking/smallCompany/sales/smallCompany/inventory
@MessageMapping收到来自/smallCompany/sales的消息。该方法根据departmentId处理消息,并发布到具有相同/{companyId}的每个订阅者,即使/{departmentId}不同。

如果这可能,任何想法,如果不是,任何将我推向正确方向的想法都会很棒。

我知道现在回答为时已晚! 但是我现在看到了这个问题! 所以,为了引导其他看到这个问题的人,我应该说:

您有几种解决方案:

1- 简单用户注册表:

@Autowired private SimpUserRegistry simpUserRegistry;
public Set<SimpUser> getUsers() { 
return simpUserRegistry.getUsers();
}

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

2-全球列表:

你肯定已经在 Spring 启动中配置了 web-socket,所以,你可能有一个来自 WebSocketMessageBrokerConfigurer 的派生类,并覆盖 configureClientInboundChannel 来调用 setInterceptors...

您应该实现从 ChannelInterceptorAdapter 派生的自定义拦截器,并覆盖 preSend 以访问 MessageHeaderAccessor.getAccessor(...)。命令 这些命令
在 StompCommand 中定义(连接、断开连接、订阅、取消订阅,...)

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

3-其他解决方案:

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

最新更新