消息投遞方式
投遞方式一共有三種:異步投遞,延遲投遞,定時投遞。
異步投遞
同步發送:消息生產者使用持久(Persistent)傳遞模式發送信息的時候,Producer.send()方法會被阻塞,直到broker發送一個確認消息給生產者(ProducerAck),這個確認消息按時broker已經成功接收到消息並把消息保存到二級存儲中。
異步發送:如果應用程序能夠容忍一些消息的丟失,那么可以使用異步發送。異步發送不會在受到broker的確認之前一直阻塞Producer.send方法。
如果想要使用異步,在brokerURL中增加jms.alwaysSyncSend=false&jms.useAsyncSend=true屬性
1. 如果設置了alwaysSyncSend=true系統將會忽略useAsyncSend設置的值都采用同步。
2. 當alwaysSyncSend=false時,“NON_PERSISTENT”(非持久化),事務中的消息將使用“異步發送”
3. 當alwaysSyncSend=false時,如果指定了useAsyncSend=true,“PERSISTENT”類型的消息使用異步發送。如果useAsyncSend=false,“PERSISTENT”類型的消息使用同步發送。
總結:默認情況(alwaysSyncSend=false,useAsyncSend=false),非持久化消息,事務內的消息均采用異步發送;對於持久化消息采用同步發送。
異步投遞如何確認發送成功:
異步投遞丟失消息的場景是:生產者設置UserAsyncSend=true,使用producer.send(msg)持續發送消息。
由於消息不阻塞,生產者會認為所有send的消息均被成功發送至MQ。如果MQ突然宕機,此時生產者端內存中尚未被發送至MQ的消息都會丟失。
這時,可以給異步投遞方法接收回調,以確認消息是否發送成功。
延遲投遞
生產者提供兩個發送消息的方法,一個是即時發送消息,一個是延時發送消息。
延遲投遞和定時投遞的四個屬性

首先修改activemq.xml文件里的屬性,添加schedulerSupport=“true”配置
1 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq. data}" schedulerSupport="true" />
之后在代碼里設置延時時長
1 message.setLongProperty(ScheduledMessage.AMO_SCHEDULED_DELAY, 10000);//10秒
定時投遞
啟動類上添加

業務上添加

死信隊列
死信隊列,用來保存處理失敗或者過期的信息。
出現以下情況的時候,消息會被重發:
A transacted session is used and rollback() is called.
A transacted session is closed before commit is called.
A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called.
當一個消息被重發超過6次(缺省為6),會給broker發送一個“poison ack”,這個消息被認為是a poison pill,這時broker會將這個消息發送到死信隊列,以便后續處理。
注意兩點:
1. 缺省持久消息過期,會被送到DLQ,非持久消息不會送到DLQ。
2. 缺省的死信隊列是ActiveMQ.DLQ,如果沒有特別指定,死信都會被發送到這個隊列中。
可以通過配置文件activemq.xml來調整死信發送策略。

為每個隊列建立獨立得死信隊列(下面是queue和topic兩種形式,選一種即可)

效果:

還有其他策略,這個要根據實際情況來對應處理。
比如:
非持久消息保存到死信隊列
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>
重發策略
RedeliveryPolicy重發策略設置

參考:
1. https://www.cnblogs.com/rainwang/p/5146223.html
2. 黑馬程序員得mq教程
持續更新!!!
