使用RabbitMQ stomp适配器在不同服务器的订阅中传递消息

时间:2017-01-27 23:47:30

标签: spring rabbitmq stomp spring-websocket

我使用Spring设置Stomp服务器端点(扩展AbstractWebSocketMessageBrokerConfigurer)

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/topic","/queue")
        .setRelayHost(<rmqhost>);
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/myapp/websockets").setAllowedOrigins("*");
}

目标是我可以拥有多个服务器,并且客户端将连接到其中任何一个服务器以获取特定主题:/ topic / topic-id-1

任何服务器(一次)都可以使用Spring的SimpMessagingTemplate

为此主题发送消息
messagingTemplate.convertAndSend(destination, message);

其中destination =&#34; / topic / topic-id-1&#34;。 例如:我有2个服务器节点和一个客户端连接到每个服务器节点,订阅相同的主题(/ topic / topic-id-1)。目标是,如果服务器1发送了topic-id-1的消息,它应该通过rabbitmq中继到订阅同一主题的两个客户端。我看到使用路由密钥创建的队列为&#34; topic-id-1&#34;,但只有连接到发送消息的服务器的客户端才会明确接收它。我在这里错过了什么吗?是不是RMQ stomp经纪人应该在同一主题的所有订阅中间传递一台服务器发送的订阅消息?服务器是否需要执行其他操作来获取其他节点发送的消息?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。经过一整天的探索,我终于找到了解决方案!!虽然很容易配置。

registry.enableStompBrokerRelay("/topic/", "/queue/", "/exchange/") 
   .setUserDestinationBroadcast("/topic/log-unresolved-user") 
   .setUserRegistryBroadcast("/topic/log-user-registry")

您唯一需要做的就是启用StompBrokerRelay时配置setUserDestinationBroadcastsetUserRegistryBroadcast。而且有效!

我从here找到了解决方案。以为那个家伙!

答案 1 :(得分:0)

我不确定这是否完全相同,但我刚刚解决了一个非常类似的问题。我在这里发布了答案:Sending STOMP messages from other layers of an application

我决定将中继服务器的实现拆分为它自己的设置,然后在rabbitmq服务器和每个服务器上的websocket订阅者之间手动转发消息。

希望这对你有用。