【发布时间】:2017-06-21 19:16:40
【问题描述】:
使用用于 Web 套接字消息传递的 Stomp 代理中继,我可以订阅目标 /topic/mydest。这将创建一个代理订阅,并接收系统中的某些东西为此代理目标触发的所有消息,这会在系统中的某些事件发生时发生。
我可以订阅一个目的地/app/mydest,一个带有@SubscribeMapping("mydest") 的控制器方法将被调用,返回值只在这个套接字上作为消息发送回来。据我所知,这是唯一会为此订阅发送的消息。
有没有办法将这些合并到一个订阅中,即为某个/topic 目的地创建一个代理订阅,并触发一些代码,直接将消息发送回订阅者?
用例:当系统发生错误时,将带有当前错误计数的消息发送到/topic/mydest。当一个新客户订阅时,我只想向他发送最后一个已知的错误计数。其他人暂时不感兴趣,因为计数没有改变。
我当前的解决方案是同时订阅/app/mydest 和/topic/mydest 并在客户端上使用相同的消息处理程序。但它确实是一个合乎逻辑的订阅,而且有点容易出错,因为客户需要记住同时订阅两者。
在这种情况下我的问题是:/app/ 订阅是否还会有更多消息?有什么可以触发的吗?在不向现有订阅者发送冗余消息的情况下,我还能如何将初始信息发送给某个主题的订阅者?
根据要求,这是我的 Websocket 配置类。
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/queue/", "/topic/", "/exchange/");
registry.setApplicationDestinationPrefixes("/app");
}
}
【问题讨论】:
-
也许我应该澄清一下:从实际的角度来看,我描述的当前解决方案已经足够好了。我提出这个问题的主要动机是充分掌握订阅用户目的地的意图,以及对代理目的地的订阅采取行动的方式。
标签: spring stomp spring-websocket spring-messaging