简体   繁体   中英

Spring Cloud Stream: how to republish to dead letter queue and also throw exception

I'm migrating a project that uses Spring AMQP to a project that uses Spring Cloud Stream with RabbitMQ.

In my old project, when some exception occurred while processing a message using @RabbitListener, that exception was thrown. If there was a dead letter queue binded, exception was still thrown (only once if there were retries, the last one I guess). This was very helpful for logging purposes.

In Spring Cloud there is a dead letter queue mechanism for @StreamListener if you define the properties:

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

But if you have a method like this (is just an example):

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

Logs are:

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

Is there any way to throw the exception (only in the last retry)?

Thanks!

See the documentation about consumer properties.

Set ...consumer.max-attempts=1 to disable retry.

You can handle the exception, log it and then throw AmqpRejectAndDontRequeueException. This will send the message to dead letter queue

You are under @StreamListener where would you expect the exception to go? who is catch it?

you can do it something like that:

@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
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM