springboot+activemq中引入重發機制
阿新 • • 發佈:2017-12-23
簡介 一個 value nec ring cto 為我 body over ,簡稱DLQ,用於進行後續分析。
一、簡介
在使用activemq消息中間件進行消息隊列傳輸時,總會由於各種原因導致消息失敗。
一個經典的場景是一個生成者向Queue中發消息,裏面包含了一組郵件地址和郵件內容。而消費者從Queue中將消息一條條讀出來,向指定郵件地址發送郵件。消費者在發送消息的過程中由於種種原因會導致失敗,比如網絡超時、當前郵件服務器不可用等。這樣我們就希望建立一種機制,對於未發送成功的郵件再重新發送,也就是重新處理。重新處理超過一定次數還不成功,就放棄對該消息的處理,記錄下來,繼續對剩余消息進行處理。
ActiveMQ為我們實現了這一功能,叫做ReDelivery(重新投遞)。當消費者在處理消息時有異常發生,會將消息重新放回Queue裏,進行下一次處理。當超過重試次數時,消息會被放置到一個特殊的Queue中,即Dead Letter Queue
二、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中引入重發機制