7.rabbitmq-消息的拒絕

消息確認可以讓 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é)束......

下一篇 8.rabbitmq-死信交換機和死信隊列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容