rabbitMQ處理消息隊列時的自動應(yīng)答機制淺述

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?原創(chuàng)者:文思

網(wǎng)絡(luò)資料(基本方向):

1:當出現(xiàn)異常時六荒,我們需要把這個消息回滾到消息隊列要么拋棄此消息:

2:經(jīng)過開發(fā)中的實際測試蠢琳,當讓消息回滾到消息隊列時,這條消息不會回到隊列尾部葡秒,而是仍是在隊列頭部双吆,這時消費者會立馬又接收到這條消息羞秤,進行處理鞠抑,接著拋出異常,進行回滾嫌吠,如此反復(fù)進行。這種情況會導(dǎo)致消息隊列處理出現(xiàn)阻塞掺炭,消息堆積辫诅,導(dǎo)致正常消息也無法運行。對于消息回滾到消息隊列涧狮,我們希望比較理想的方式時出現(xiàn)異常的消息到達消息隊列尾部炕矮,這樣既保證消息不會丟失么夫,又保證了正常業(yè)務(wù)的進行,因此我們采取的解決方案是肤视,將消息進行應(yīng)答档痪,這時消息隊列會刪除該消息,同時我們再次發(fā)送該消息到消息隊列邢滑,這時就實現(xiàn)了錯誤消息進行消息隊列尾部的方案腐螟。

實際應(yīng)用:

在做jodconvert結(jié)合mq進行文檔異步轉(zhuǎn)換時,因在process函數(shù)中沒有捕獲convert方法(文檔轉(zhuǎn)換時的方法)中拋出的異常困后,導(dǎo)致mq的消費方(process函數(shù))接收消息消費時失敗->返回隊列第一位->執(zhí)行->消費失敗->返回隊列第一位,如此反復(fù)導(dǎo)致后續(xù)mq消息被阻塞無法接收執(zhí)行乐纸,用catch()捕獲異常后,線應(yīng)答成功摇予,不會再次進入隊列執(zhí)行汽绢,解決。

以此總結(jié)出mq自動應(yīng)答的1個知識點:

Spring 與RabbitMq集成對消息的處理方式是默認自動應(yīng)答(百度)侧戴,但是mq消息消費與否的標志宁昭,網(wǎng)絡(luò)上百度出來的資料有些是錯誤的,現(xiàn)在通過程序來進行驗證和判斷酗宋,結(jié)論是:以process函數(shù)是否拋出異郴蹋或者異常是否被catch捕獲為標準,以下是程序推論:

process是消息放處理接收mq消息函數(shù)

在使用mq消息進行業(yè)務(wù)處理的過程中本缠,也就是使用消息進行業(yè)務(wù)處理的時候(convertUrl = queueBusinessHandlerService.ms2pdfByQueueExternalUtil(inputUrl))斥扛,什么情況下系統(tǒng)會認為消息消費不會失敗,已經(jīng)應(yīng)答了呢丹锹,現(xiàn)在驗證異常依次上拋稀颁,在最外層捕獲(異常一定要依次通過throw拋出,否則程序就因為發(fā)生異常而中斷):

1

1.1

1.1.

1.1.1

1.1.1.1

從1.1.1.1依次上拋到1

然后在最外層捕獲:

通過命令行看日志可以看到楣黍,不會再執(zhí)行那條mq記錄了匾灶,也就說明:

當convertUrl = queueBusinessHandlerService.ms2pdfByQueueExternalUtil(inputUrl)拋出異常時被catch捕獲,則process方法會認為消息消費成功租漂,因為異常被捕獲了嘛阶女,process程序體沒有中斷,執(zhí)行完了哩治,所以認為消費成功秃踩,進行了自動應(yīng)答,即使業(yè)務(wù)函數(shù)處理失敗了业筏,也不在會出現(xiàn)隊列中了憔杨。

如果需要對失敗的記錄進行處理,建議在catch{}中:

//手動進行應(yīng)答channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);

//重新發(fā)送消息到隊列尾部channel.basicPublish(message.getMessageProperties().getReceivedExchange(),message.getMessageProperties().getReceivedRoutingKey(), MessageProperties.PERSISTENT_TEXT_PLAIN,JSON.toJSONBytes(new Object()));

不需要再次處理的就不用管了蒜胖。


什么情況下算消費失敗消别,沒有應(yīng)答成功呢抛蚤,如果不在process中捕獲異常,或者在try{}catch(){}以外的地方發(fā)生異常寻狂,如下:

process中報了異常且沒有被catch捕獲岁经,則process認為消息接收時出現(xiàn)錯誤,沒有消費成功蛇券,則自動返回到隊里第一位缀壤,再次重復(fù)執(zhí)行:

.

反復(fù)回到隊列重復(fù)執(zhí)行...

.

在使用spring boot時,默認的是自動應(yīng)答怀读,如果想手工應(yīng)答诉位,在application.propretes中:

spring.rabbitmq.listener.acknowledge-mode=manual

則:

mq順利執(zhí)行完沒有報錯,但再次發(fā)送mq:

無法接收到新的mq消息菜枷。就需要在程序中進行手工消息應(yīng)該操作:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苍糠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啤誊,更是在濱河造成了極大的恐慌岳瞭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚊锹,死亡現(xiàn)場離奇詭異瞳筏,居然都是意外死亡,警方通過查閱死者的電腦和手機牡昆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門姚炕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丢烘,你說我怎么就攤上這事柱宦。” “怎么了播瞳?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵掸刊,是天一觀的道長。 經(jīng)常有香客問我赢乓,道長忧侧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任牌芋,我火速辦了婚禮蚓炬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躺屁。我一直安慰自己试吁,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布楼咳。 她就那樣靜靜地躺著熄捍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪母怜。 梳的紋絲不亂的頭發(fā)上余耽,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音苹熏,去河邊找鬼碟贾。 笑死,一個胖子當著我的面吹牛轨域,可吹牛的內(nèi)容都是我干的袱耽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼干发,長吁一口氣:“原來是場噩夢啊……” “哼朱巨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枉长,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冀续,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后必峰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洪唐,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年吼蚁,在試婚紗的時候發(fā)現(xiàn)自己被綠了凭需。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡肝匆,死狀恐怖粒蜈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情术唬,我是刑警寧澤薪伏,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站粗仓,受9級特大地震影響嫁怀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜借浊,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一塘淑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚂斤,春花似錦存捺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岗钩。三九已至,卻和暖如春肖油,著一層夾襖步出監(jiān)牢的瞬間兼吓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工森枪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留视搏,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓县袱,卻偏偏與公主長得像浑娜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子式散,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理筋遭,服務(wù)發(fā)現(xiàn),斷路器杂数,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • 來源 RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務(wù)器宛畦。支持消息的持久化、事務(wù)揍移、擁塞控...
    jiangmo閱讀 10,367評論 2 34
  • 關(guān)于消息隊列次和,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了那伐,但一直沒騰出空踏施,近來分別碰到幾個朋友聊這塊的技術(shù)選型,是時...
    預(yù)流閱讀 584,942評論 51 786
  • 有些東西,給你打開一扇窗的同時卻關(guān)閉了一道門诉探,比如社交網(wǎng)絡(luò) 政治的功能之一是合理而恰當?shù)靥幹弥e言 時間這個東西日熬,其...
    i圖紋系閱讀 1,474評論 0 14
  • 楔子 君問歸期未有期 我叫戚期, 親戚朋友們都說我的名字不好聽肾胯,取得很隨便竖席,好像帶著某種欺騙似的。 而我卻...
    殤淺離閱讀 332評論 1 0