Spring Cloud Stream:如何重新发布到死信队列并引发异常

时间:2019-01-18 16:36:45

标签: spring-integration spring-cloud spring-amqp spring-cloud-stream

我正在将使用Spring AMQP的项目迁移到使用带有RabbitMQ的Spring Cloud Stream的项目。

在我的旧项目中,当使用@RabbitListener处理消息时发生某些异常时,将引发该异常。如果绑定了一个死信队列,则仍会引发异常(如果有重试,则只会抛出一次,我猜是最后一次)。这对于日志记录非常有用。

如果您定义属性,则在Spring Cloud中,@ StreamListener会有死信队列机制:

spring.cloud.stream.bindings.input1.destination=dest1
spring.cloud.stream.rabbit.bindings.input1.consumer.auto-bind-dlq=true
spring.cloud.stream.rabbit.bindings.input1.consumer.republishToDlq=true

但是,如果您有这样的方法(仅作为示例):

@StreamListener("input1")
public void process(String message){
    System.out.println("Trying...");
    throw new RuntimeException();
}

日志为:

Trying...
Trying...
Trying...
(end of log, no exception thrown)

是否有任何引发异常的方法(仅在上次重试中)?

谢谢!

3 个答案:

答案 0 :(得分:3)

请参阅有关使用者属性的文档。

设置...consumer.max-attempts=1以禁用重试。

答案 1 :(得分:0)

您可以处理该异常,将其记录下来,然后引发AmqpRejectAndDontRequeueException。这会将消息发送到死信队列

答案 2 :(得分:0)

您在 @StreamListener 之下,您希望异常去哪里?谁抓住了它?

你可以这样做:

@StreamListener("input1")
public void process(String message){
    try {
        System.out.println("Trying...");
        throw new RuntimeException();
        // or the actual code that handle the message
    } catch (RuntimeException re) {
        // handle the exception, logging etc.
        throw re
    }
}