auto
和manual
区别其实就如字面意思一般,auto
代表自动确认消息,只要消费者的方法执行完了,就自动告诉mq
当前消息确认.manual
则是需要手动通知mq
。不需要想的很复杂就是这么直接.
ImmediateAcknowledgeAmqpException
异常,则视为成功消费,确认该消息。AmqpRejectAndDontRequeueException
异常的时候,则消息会被拒绝丢弃,并且不会重新入队。requeue = true
(默认就是true)时会重新入队无论有没有异常,标准只有是否主动调用basicAck()、basicNack()
等方法,没有调用则一直阻塞.
因此有异常时,(有重试就重试),抛出异常后,没有调用时,还是会一直阻塞。即使是auto
模式的那两个特殊的异常,在manual
中都是一样的,不会有特殊处理.
server:
port: 9009
spring:
rabbitmq:
host: xxxx
port: 5672
username: xxxx
password: xxxx
virtual-host: /fchan
listener:
simple:
#(默认值为true)在消费者出现异常时是否丢弃该消息还是重新入队,true:重新入队,入队后在队首
#default-requeue-rejected: true
#qos = concurrency * prefetch
#concurrency: 1
#max-concurrency: 5
#qos = concurrency * prefetch
prefetch: 2
#acknowledge-mode: auto
AmqpRejectAndDontRequeueException
处理的requeue = false
(剩下那个特殊异常视为成功,与此处无关),抛出这个异常的时候直接就是拒绝并且丢弃。basicNack()
的 boolean requeue
参数default-requeue-rejected
auto
模式中,处理其他异常时,拒绝消息,此时如果配置了default-requeue-rejected=false
则会丢弃消息