ActiveMQ消息投遞方式+死信隊列


死信隊列

  死信隊列(Dead Letter Queue,DLQ),用來保存處理失敗或者過期的信息。出現以下情況的時候,消息會被重發:

  • 在一個事務session中調用了session.rollback()方法。
  • 在一個事務session中,session.commit()之前調用了commit.close()。
  • 在session中使用CLIENT_ACKNOWLEDGE簽收模式,並且調用了session.recover()方法。
  • 在非事務session中使用INDIVIDUAL_ACKNOWLEDGE簽收模式,並且調用了session.recover()方法。

  在session中使用AUTO_ACKNOWLEDGE簽收模式,在異步(messageListener)消費消息情況下,如果onMessage方法異常且沒有被catch,此消息會被redelivery。

  當一個消息被重發次數超過設置的最大重發次數(缺省為6)時,會給broker發送一個“poison ack”,此消息被認為是a poison pill,這時broker會將這個消息發送到死信隊列,以便后續處理。注意兩點:

  1. 缺省持久消息過期,會被送到DLQ,非持久消息不會送到DLQ。

  2. 默認的死信隊列是ActiveMQ.DLQ,如果沒有特別指定,死信都會被發送到這個隊列中。 

  可以通過配置文件activemq.xml來調整死信發送策略。在瀏覽器地址欄輸入 http://localhost:8161/admin  ,打開ActiveMQ的管理界面,可以看到私信隊列數量:

 

  從控制面板可知,死信隊列默認名為ActiveMQ.DLQ,其數量為20條。順便介紹一下控制面板各個表頭的含義:

  1. Number Of Consumers:消費者數量;
  2. Number Of Pending Messages:等待消費的消息數量,這個是當前未出隊列的數量;
  3. Messages Enqueued:進入隊列的消息量,它只增不減,重啟后會清零;
  4. Messages Dequeued:被消費的消息量,重啟后會清零。

  如果設置了消息的持久化,那么重啟前沒有被消費的消息會在Number Of Pending Messages中顯示。

配置死信隊列

  在activemq.xml中,為隊列【east7-queue】配置獨立的死信隊列,下面是queue和topic兩種形式,我選擇點對點模式queue,新增配置信息字體為紅色:

<destinationPolicy>
            <policyMap>
              <policyEntries>
                <policyEntry queue=">">
                    <deadLetterStrategy>
                    <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
                    </deadLetterStrategy>
                </policyEntry>
                <policyEntry topic=">" >
                    <!-- The constantPendingMessageLimitStrategy is used to prevent slow topic consumers to block producers and affect other consumers by limiting the number of messages that are retained For more information, see: http://activemq.apache.org/slow-consumer-handling.html

                    -->
                  <pendingMessageLimitStrategy>
                    <constantPendingMessageLimitStrategy limit="1000"/>
                  </pendingMessageLimitStrategy>
                </policyEntry>
              </policyEntries>
            </policyMap>
        </destinationPolicy>

 

  1. queuePrefix:設置死信隊列前綴。
  2. useQueueForQueueMessages: 設置使用隊列保存死信,還可以設置useQueueForTopicMessages,使用Topic來保存死信。

  使用<policyEntry queue="east7-queue">指定待創建死信隊列的隊列為DLQ.east7-queue,其它的隊列的死信隊列使用隊列名。如下圖所示,myDest.queue私信隊列中消息數量為3。如果<policyEntry queue=">">,則是為所有點對點模式隊列創建DLQ.+隊列名的死信隊列。

  還有其他策略,這個要根據實際情況來對應處理。比如:非持久消息保存到死信隊列

 
        
1 <policyEntry queue=">">
2     <deadLetterStrategy>
3         <sharedDeadLetterStrategy processNonPersistent="true" />
4     </deadLetterStrategy>
5 </policyEntry>  
 
        

  過期消息不保存到死信隊列:

1 <policyEntry queue=">">
2     <deadLetterStrategy>
3         <sharedDeadLetterStrategy processExpired="false" />
4     </deadLetterStrategy>
5 </policyEntry>

  關於本文內容,大家有什么看法?歡迎留言討論,也希望大家多多點贊關注。祝各位生活愉快!工作順利!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM