概述
auto
和
manual
差別其實就如字面意思一般,
auto
代表自動确認消息,隻要消費者的方法執行完了,就自動告訴
mq
目前消息确認.
manual
則是需要手動通知
mq
。不需要想的很複雜就是這麼直接.
auto自動确認
- 消息成功被消費,沒有抛出異常,則自動确認,回複ack。
- 當抛出
異常,則視為成功消費,确認該消息。ImmediateAcknowledgeAmqpException
- 當抛出
異常的時候,則消息會被拒絕丢棄,并且不會重新入隊。AmqpRejectAndDontRequeueException
- 其他的異常,則消息會被拒絕,且
(預設就是true)時會重新入隊requeue = true
manual人工确認
無論有沒有異常,标準隻有是否主動調用
basicAck()、basicNack()
等方法,沒有調用則一直阻塞.
是以有異常時,(有重試就重試),抛出異常後,沒有調用時,還是會一直阻塞。即使是
auto
模式的那兩個特殊的異常,在
manual
中都是一樣的,不會有特殊處理.
關于default-requeue-rejected(重新入隊)屬性的優先級
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