Несколько @RabbitListeners отправляют ответ в одну очередь при использовании sendAndReceive () в продюсере - PullRequest
0 голосов
/ 29 сентября 2019

Я использую SpringBoot с Spring AMQP и хочу использовать шаблон RPC, используя синхронный метод sendAndReceive в продюсере.Моя конфигурация предполагает 1 обмен с 2 различными привязками (1 для каждой операции на одном и том же ресурсе).Я хочу отправить 2 сообщения с 2 разными RouingKeys и получить ответ в разных очередях ответа

Проблема в том, насколько я знаю, 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);

...

customer config:


    @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 Ответ

1 голос
/ 29 сентября 2019

Насколько я знаю, sendAndReceive будет ждать ответа в очереди с именем ".replies"

Откуда вы взяли эту идею?

В зависимости отв какой версии вы используете, для каждого запроса будет создаваться временная очередь ответов, или используется механизм «прямого ответа» RabbitMQ, что снова означает, что на каждый запрос отвечает в выделенной псевдо-очереди с именем amq.rabbitmq.reply-to.

Я не вижу возможности, чтобы один продюсер получил ответ другого;даже если вы используете явный контейнер ответов (который, как правило, больше не нужен), шаблон будет соотносить ответы с запросами.

Попробуйте включить ведение журнала DEBUG, чтобы увидеть, предоставляет ли какие-либо подсказки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...