Spring AMQP RabbitMQ RPC - 处理响应异常

Spring AMQP RabbitMQ RPC - Handle response exceptions

我正在尝试使用 RPC AMQP RabbitMQ 队列来发送和接收消息。问题是我设置了一个 setReplyTimeout 值。当发生这种情况时,我得到一个 "org.springframework.amqp.AmqpRejectAndDontRequeueException: Reply received after timeout"。我在传入队列上设置了 DLQ,但当 spring 尝试 return 其队列中自动创建的消息时,似乎收到了异常。因此,在将消息发送回生产者时如何处理异常?理想情况下,我希望任何在发送到 DLQ 的生产者时出现异常的消息。

我正在使用

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

它需要一个没有 setQueues 的 SimpleRabbitListenerContainerFactory。 rabbitTemplate 也没有 rabbitTemplate.setReplyQueue

谢谢, 布莱恩

不要将默认的内置回复侦听器容器与直接回复伪队列一起使用,而是将 Reply Listener Container 与配置为将无法传递的消息路由到 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);

重要

如果您有多个客户端实例,每个实例都需要自己的回复队列。