当消费者在消息处理期间并且在手动ack工作之前抛出异常republishToDlq时,但是原始队列消息总是处于nack状态。
环境
Spring Boot:2.1.11.RELEASE
Spring Cloud:Greenwich.SR4
Spring Cloud Stream:Fishtown.SR4
spring-cloud-stream-binder-rabbit:2.1.4.RELEASE
Yaml配置
spring:
cloud:
stream:
bindings:
input:
binder: rabbit
group: ${spring.application.name}_input
content-type: application/json
destination: push_message
rabbit:
bindings:
input:
consumer:
acknowledge-mode: MANUAL
exchange-type: topic
consumer-tag-prefix: ${spring.application.name}_input
binding-routing-key: ${spring.application.name}_input
autoBindDlq: true
republishToDlq: true结果
期望
在republishToDlq之后,Nack或拒绝原始队列消息。
我对上面的理解正确吗?如果没有,请纠正我。谢谢!
发布于 2020-01-17 19:02:03
从Spring AMQP的角度来看,使用手动ack模式意味着“应用程序”完全负责ack消息。
同样,从Spring AMQP的角度来看,republishToDlq被认为是一个“成功的”交付。
第一个问题是“你使用手册的用例是什么”?它很少被使用,而且经常被错误地使用。
也就是说,我可以看到一个论点,从Spring AMQP的角度来看,绑定器是应用程序的一部分,我们应该考虑在将消息发布到绑定器中的DLQ之后(当ack模式是手动的时候)。
请根据活页夹打开GitHub新功能问题,我们将进行查看。
同时,解决办法是在侦听器中捕获异常,并在重新抛出异常之前确认(而不是nack)消息。
但是,您应该考虑是否真的需要手动确认。
https://stackoverflow.com/questions/59785081
复制相似问题