Spring AMQP RabbitMQ RPC-处理响应异常

时间:2018-12-12 17:10:39

标签: rabbitmq spring-amqp spring-rabbitmq

我正在尝试使用RPC AMQP RabbitMQ队列发送和接收消息。问题是我已经设置了setReplyTimeout值。发生这种情况时,我收到“ org.springframework.amqp.AmqpRejectAndDontRequeueException:超时后收到答复”。我在传入队列上设置了DLQ,但是当spring尝试在其自动创建的队列上返回消息时,似乎收到了异常。因此,在将消息发送回生产者时如何处理异常?理想情况下,我希望任何发送到生产者的消息在发送到DLQ时都会发生异常。

我正在使用

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

它需要一个没有setQueues的SimpleRabbitListenerContainerFactory。另外,rabbitTemplate没有rabbitTemplate.setReplyQueue

谢谢, 布莱恩

1 个答案:

答案 0 :(得分:0)

与其将默认的内置回复侦听器容器与直接回复伪队列一起使用,不如将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);

重要

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