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);
重要
如果您有多个客户端实例,每个实例都需要自己的回复队列。
我正在尝试使用 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);
重要
如果您有多个客户端实例,每个实例都需要自己的回复队列。