我正在开发一个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
路径的活跃订阅者的每个部门。
e.g。
有3个websocket订阅者,
/smallCompany/booking
,/smallCompany/sales
,/smallCompany/inventory
@MessageMapping
从/smallCompany/sales
收到消息。该方法根据departmentId
处理邮件,并发送给具有相同/{companyId}
的每个订阅者,即使/{departmentId}
不同。
任何想法,如果这是可能的,如果没有,任何推动我朝着正确的方向发展的想法都会很棒。
答案 0 :(得分:0)
我知道答案为时已晚!但是我现在看到了这个问题! 因此,为了指导其他会看到此问题的人,我应该说:
您有几种解决方案:
1- SimpUserRegistry:
@Autowired private SimpUserRegistry simpUserRegistry;
public Set<SimpUser> getUsers() {
return simpUserRegistry.getUsers();
}
检查此链接: Is there a Spring WebSocketSession repository?
2-全局列表:
您肯定已经在春季启动中配置了网络套接字,因此,可能您有一个WebSocketMessageBrokerConfigurer的派生类,并覆盖了configureClientInboundChannel以调用setInterceptors ...
您应该实现从ChannelInterceptorAdapter派生的自定义拦截器,并覆盖preSend以访问MessageHeaderAccessor.getAccessor(...)。command
这些命令在StompCommand中定义(CONNECT,DISCONNECT,SUBSCRIBE,UNSUBSCRIBE等)
通过使用StompCommand.SUBSCRIBE / UNSUBSCRIBE检查accessor.command,您可以创建并同步全局的订阅者静态列表,并在需要的任何地方使用它。
3-其他解决方案:
检查此链接:
how to capture subscribe event in my webSocket server with Spring 4