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);

ВАЖНЫЙ

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

Другие вопросы по тегам