在生产者中使用sendAndReceive()时,多个@RabbitListeners将答复发送到同一队列

时间:2019-09-29 13:32:56

标签: spring-boot rabbitmq rpc spring-amqp

我正在将SpringBoot与Spring AMQP一起使用,并且我想在生产者中通过同步sendAndReceive方法使用RPC模式。我的配置假设1个交换具有2个不同的绑定(对于同一资源上的每个操作1个)。我想使用2个不同的routingKeys发送2条消息,并在不同的答复队列上接收响应

据我所知,问题是sendAndReceive将等待名称为“ .replies”的队列上的答复,因此这两个答复都将发送到products.replies队列中(至少这是我的理解)。

我的发布者配置:

    @Bean
    public DirectExchange productsExchange() {
        return new DirectExchange("products");
    }

    @Bean
    public OrderService orderService() {
        return new MqOrderService();
    }

    @Bean
    public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(producerJackson2MessageConverter());
        return rabbitTemplate;
    }

    @Bean
    public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

和2个发件人:

...
final Message response = template.sendAndReceive(productsExchange.getName(), "products.get", message);
...

final Message response = template.sendAndReceive(productsExchange.getName(), "products.stock.update", message);

...

消费者配置:


    @Bean
    public Queue getProductQueue() {
        return new Queue("getProductBySku");
    }

    @Bean
    public Queue updateStockQueue() {
        return new Queue("updateProductStock");
    }

    @Bean
    public DirectExchange exchange() {
        return new DirectExchange("products");
    }

    @Bean
    public Binding getProductBinding(DirectExchange exchange) {
        return BindingBuilder.bind(getProductQueue())
                .to(exchange)
                .with("products.get");
    }

    @Bean
    public Binding modifyStockBinding(DirectExchange exchange) {
        return BindingBuilder.bind(updateStockQueue())
                .to(exchange)
                .with("products.stock.update");
    }

和@RabbitListeners具有以下特征:

 @RabbitListener(queues = "getProductBySku")
    public Message getProduct(GetProductResource getProductResource) {...}

 @RabbitListener(queues = "updateProductStock")
    public Message updateStock(UpdateStockResource updateStockResource) {...}

我注意到第二个发送方收到2个响应,其中一个响应类型无效(来自第一个接收方)。有什么方法可以使这些连接与众不同?还是为每个操作使用单独的交换是唯一合理的解决方案?

1 个答案:

答案 0 :(得分:2)

  

据我所知,sendAndReceive将在名称为“ .replies”的队列上等待答复

你从哪里得到这个主意的?

根据您使用的版本,将为每个请求创建一个临时答复队列,或者使用RabbitMQ的“直接答复”机制,这再次意味着每个请求都在称为{{ 1}}。

我看不到任何一位制片人要得到另一位制片人的答复;即使您使用显式答复容器(通常不再需要),模板也会将答复与请求相关联。

尝试启用DEBUG日志记录以查看是否提供任何提示。