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

时间:2017-03-21 09:49:49

标签: spring-boot websocket stomp

我正在开发一个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端点,从此映射中检索companyIddepartmentId

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

e.g。

  

有3个websocket订阅者,     /smallCompany/booking/smallCompany/sales/smallCompany/inventory   @MessageMapping/smallCompany/sales收到消息。该方法根据departmentId处理邮件,并发送给具有相同/{companyId}的每个订阅者,即使/{departmentId}不同。

任何想法,如果这是可能的,如果没有,任何推动我朝着正确的方向发展的想法都会很棒。

1 个答案:

答案 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