Spring AMQP RabbitMQ RPC - Обработка исключений ответа
Я пытаюсь использовать очередь RPC AMQP RabbitMQ для отправки и получения сообщений. Проблема в том, что я установил значение setReplyTimeout. Когда это происходит, я получаю "org.springframework.amqp.AmqpRejectAndDontRequeueException: ответ получен после тайм-аута". У меня настроен DLQ для входящей очереди, но похоже, что исключение получено, когда Spring пытается вернуть сообщение в своей очереди, которое создается автоматически. Таким образом, как я могу обработать исключения при отправке сообщений обратно производителю? В идеале я хотел бы, чтобы любое сообщение получало исключение при отправке производителю, отправляемому в DLQ.
я использую
@RabbitListener(queues = QueueConfig.QUEUE_ALL, containerFactory = "containerFactoryQueueAll")
Это требует SimpleRabbitListenerContainerFactory, у которого нет setQueues. Также rabbitTemplate не имеет rabbitTemplate.setReplyQueue
Спасибо Брайан
1 ответ
Вместо использования встроенного контейнера прослушивателя ответов по умолчанию с псевдо-очередью прямого ответа используйте контейнер прослушивателя ответов с именованной очередью, которая настроена для маршрутизации недоставленных сообщений в 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);
ВАЖНЫЙ
Если у вас есть несколько экземпляров клиента, каждому требуется своя очередь ответов.