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

问题描述 投票:0回答:1

我正在将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个响应,其中一个响应类型无效(来自第一个接收方)。有什么方法可以使这些连接与众不同?还是对每个操作使用单独的交换是唯一合理的解决方案?

我正在将SpringBoot与Spring AMQP一起使用,并且我想在生产者中通过同步sendAndReceive方法使用RPC模式。我的配置假设1个交换具有2个不同的绑定(每个绑定有1个...

spring-boot rabbitmq rpc spring-amqp
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.