消息確認可以讓 RabbitMQ 知道消費者已經(jīng)接受并處理完消息。但是如果消息本身或者消息的處理過程出現(xiàn)問題怎么辦?需要一種機制,通知RabbitMQ,這個消息,我無法處理,請讓別的消費者處理。這里就有兩種機制,Reject 和 Nack。
reject
reject在拒絕消息時,可以使用requeue標識。
1.requeue為true,消息會重新回到隊列中,并通過輪循機制推送給消費者(可能是多個)。
這里需要注意的是,拒絕這條消息的消費者同樣會在再次推送的消費者列表中。這個下面會再演示下。
2.requeue為false時,這條消息會直接被丟棄。
//帶二個參數(shù)為requeue
channel.basicReject(envelope.getDeliveryTag(), true);
nack
跟reject方式類似,也同樣的可以指定requeue.不同的是,nack可以一次性拒絕多條消息。
//帶二個參數(shù)為requeue
channel.basicNack(envelope.getDeliveryTag(),
requeue=true場景演示
創(chuàng)建一個生產(chǎn)者,生產(chǎn)10條消息到A隊列,
A隊列開3個消費者:消費者A,消費者B,消費者reject/nack,拒絕時指定requeue為true
一.10條消息通過輪循機制分別投遞到三個消費者中。下一次接受到消息的將會是消費者B,不過暫時沒有可消費的消息了.

步驟一
二.消費者reject/nack拒絕消息3,6,9,隊列再次通過輪循機制推送消息,第一步的輪循中,消費者B會先消費消息.所以,消息3會推送到消費者B。消息6還會跑到消費者reject/nack中。消息9被消費者A消費。

步驟二
三.消費者reject/nack最后一次拒絕消息6,消息6最后又被隊列重新投遞到消費B中。

步驟三
結(jié)束......
requeue=false場景演示
創(chuàng)建一個生產(chǎn)者,生產(chǎn)10條消息到A隊列,A隊列開3個消費者:消費者A,消費者B,消費者reject/nack,拒絕時指定requeue為false。
一.10條消息通過輪循機制分別投遞到三個消費者中。消費者reject/nack指定不把消息重新放回隊列。3,6,9會被直接丟棄。

步驟一
結(jié)束......