Spring AMQP RabbitMQ RPC - Обработка исключений ответа - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь использовать очередь RPC AMQP RabbitMQ для отправки и получения сообщений.Проблема в том, что я установил значение setReplyTimeout.Когда это происходит, я получаю «org.springframework.amqp.AmqpRejectAndDontRequeueException: ответ получен после тайм-аута».У меня настроен DLQ для входящей очереди, но похоже, что исключение получено, когда Spring пытается вернуть сообщение в своей очереди, которое создается автоматически.Таким образом, как я могу обработать исключения при отправке сообщений обратно производителю?В идеале я хотел бы, чтобы любое сообщение получало исключение при отправке производителю, отправляемому в DLQ.

Я использую

@RabbitListener(queues = QueueConfig.QUEUE_ALL, containerFactory = "containerFactoryQueueAll")

Для этого требуется SimpleRabbitListenerContainerFactory, который не имеет setQueues.Также rabbitTemplate не имеет rabbitTemplate.setReplyQueue

Спасибо, Брайан

1 Ответ

0 голосов
/ 12 декабря 2018

Вместо использования встроенного контейнера прослушивателя ответов по умолчанию с псевдо-очередью прямого ответа, используйте Контейнер прослушивателя ответов с именованной очередью, настроенной на маршрутизацию недоставленных сообщений в DLQ.

RabbitTemplate настроен в качестве прослушивателя контейнера:

@Bean
public RabbitTemplate amqpTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
    rabbitTemplate.setMessageConverter(msgConv());
    rabbitTemplate.setReplyQueue(replyQueue());
    rabbitTemplate.setReplyTimeout(60000);
    rabbitTemplate.setUseDirectReplyToContainer(false);
    return rabbitTemplate;
}

@Bean
public SimpleMessageListenerContainer replyListenerContainer() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory());
    container.setQueues(replyQueue());
    container.setMessageListener(amqpTemplate());
    return container;
}

@Bean
public Queue replyQueue() {
    return new Queue("my.reply.queue");
}

Обратите внимание, что документацию необходимо обновить, но вам также необходимо

rabbitTemplate.setUseDirectReplyToContainer(false);

ВАЖНО

Если у вас есть несколько экземпляров клиента, каждому требуется своя очередь ответов.

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