我正在将使用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)
是否有任何引发异常的方法(仅在上次重试中)?
谢谢!
答案 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
}
}