使用RabbitMQ和分布式微服务配置spring WebSocketMessageBroker

时间:2016-01-13 11:37:16

标签: java spring spring-integration spring-websocket

我试图在分布式微服务中使用带有弹簧WebSocketMessageBroker的RabbitMq。

我正在使用的设置是

enter image description here

在WebSocketMessageBroker中,我使用以下配置,取自文档:

@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

   @Override
   public void registerStompEndpoints(StompEndpointRegistry registry) {
      registry.addEndpoint("/push").setAllowedOrigins("*").withSockJS();
   }

   @Override
   public void configureMessageBroker(MessageBrokerRegistry registry) {
      registry.enableStompBrokerRelay("/queue/", "/topic/", "/app");
      registry.setApplicationDestinationPrefixes("/app");
      registry.setPathMatcher(new AntPathMatcher("."));
   }
}

鉴于此配置,应该MyMicroservice发布什么交换/队列,以便将消息代理到Stomp服务?

我尝试了以下内容(在发布方面 - 在MyMicroservice中)

@Configuration
@SpringBootApplication
@EnableRabbit
public class Config {
    public static final String WEB_QUEUE = "/topic/myNotificationTopic";
    public static final String WEB_EXCHANGE = "web.exchange";

    @Bean
    Queue webQueue() {
        return new Queue(WEB_QUEUE, false);
    }

    @Bean
    TopicExchange webExchange() {
        return new TopicExchange(WEB_EXCHANGE);
    }

    @Bean
    Binding binding(Queue webQueue, TopicExchange webExchange) {
        return BindingBuilder.bind(webQueue).to(webExchange).with(WEB_QUEUE);
    }

}

@Component
public class ExamplePublisher {

    @Autowired
    private AmqpTemplate amqpTemplate;

    public void sendMessage() {
        amqpTemplate.convertAndSend(Config.WEB_QUEUE, "Hello, world");
    }
}

但是,该消息似乎不会通过WebSocket连接进行代理。

要明确,我的问题是:

  • 这种分布式配置是否支持开箱即用?
  • 鉴于示例配置,服务可以发布到的RabbitMq主题与Stomp消息代理代理之间的关系是什么?

1 个答案:

答案 0 :(得分:2)

您的解释并不清楚为什么要使用Spring AMQP进行STOMP交互,尽管无论如何都可以。

如果您要直接从Java发送STOMP消息到目标目标,我建议您查看Spring Messaging中的StompClient支持。

使用Spring AMQP(或只是AMQP协议),你应该遵循一些RabbitMQ STOMP适配器rules

  

主题目的地

     

对于将每封邮件的副本传递给所有活动订阅者的简单主题目标,可以使用/topic/<name>形式的目标。主题目标支持AMQP主题交换的所有路由模式。

     

发送到没有活动订阅者的主题目标的消息将被丢弃。

     

AMQP 0-9-1语义

     

对于SEND帧,邮件会以路由密钥amq.topic发送到<name>交换。

     

对于SUBSCRIBE帧,创建一个自动删除的非持久队列,并使用路由键amq.topic绑定到<name>交换。将根据队列创建订阅。

请注意,您最初应该subscription,否则您的邮件将在没有订阅者的情况下丢失。