死信隊列
死信隊列(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條。順便介紹一下控制面板各個表頭的含義:
- Number Of Consumers:消費者數量;
- Number Of Pending Messages:等待消費的消息數量,這個是當前未出隊列的數量;
- Messages Enqueued:進入隊列的消息量,它只增不減,重啟后會清零;
- 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>
- queuePrefix:設置死信隊列前綴。
- 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>
關於本文內容,大家有什么看法?歡迎留言討論,也希望大家多多點贊關注。祝各位生活愉快!工作順利!
