1. 程式人生 > >springboot+activemq中引入重發機制

springboot+activemq中引入重發機制

簡介 一個 value nec ring cto 為我 body over

一、簡介

在使用activemq消息中間件進行消息隊列傳輸時,總會由於各種原因導致消息失敗。

一個經典的場景是一個生成者向Queue中發消息,裏面包含了一組郵件地址和郵件內容。而消費者從Queue中將消息一條條讀出來,向指定郵件地址發送郵件。消費者在發送消息的過程中由於種種原因會導致失敗,比如網絡超時、當前郵件服務器不可用等。這樣我們就希望建立一種機制,對於未發送成功的郵件再重新發送,也就是重新處理。重新處理超過一定次數還不成功,就放棄對該消息的處理,記錄下來,繼續對剩余消息進行處理。

ActiveMQ為我們實現了這一功能,叫做ReDelivery(重新投遞)。當消費者在處理消息時有異常發生,會將消息重新放回Queue裏,進行下一次處理。當超過重試次數時,消息會被放置到一個特殊的Queue中,即Dead Letter Queue

,簡稱DLQ,用於進行後續分析。

二、RedeliveryPolicy屬性介紹

消息重發機制RedeliveryPolicy 有幾個屬性如下:

RedeliveryPolicy redeliveryPolicy= new RedeliveryPolicy();  
        //是否在每次嘗試重新發送失敗後,增長這個等待時間  
        redeliveryPolicy.setUseExponentialBackOff(true);  
        //重發次數,默認為6次   這裏設置為10次  
        redeliveryPolicy.setMaximumRedeliveries(10);  
        
//重發時間間隔,默認為1秒 redeliveryPolicy.setInitialRedeliveryDelay(1); //第一次失敗後重新發送之前等待500毫秒,第二次失敗再等待500 * 2毫秒,這裏的2就是value redeliveryPolicy.setBackOffMultiplier(2); //是否避免消息碰撞 redeliveryPolicy.setUseCollisionAvoidance(false); //設置重發最大拖延時間-1 表示沒有拖延只有UseExponentialBackOff(true)為true時生效
redeliveryPolicy.setMaximumRedeliveryDelay(-1);

三、什麽情況下會觸發消息重發

1.在使用事務的Session中,調用rollback()方法;
2.在使用事務的Session中,調用commit()方法之前就關閉了Session;
3.在Session中使用CLIENT_ACKNOWLEDGE簽收模式或者INDIVIDUAL_ACKNOWLEDGE模式,並且調用了recover()方法。
可以通過設置ActiveMQConnectionFactory來定制想要的再次傳送策略。

4.消息接收的時候拋出異常

需要註意的是:使用手動簽收模式,如果客戶端沒有調用message.acknowledge()方法是不會立刻重發消息的,只有當前Coustomer重啟時才能重新接受消息

springboot+activemq中引入重發機制