ActiveMQ的學習(四)(消息投遞方式+死信隊列+重發策略)


消息投遞方式

 

投遞方式一共有三種:異步投遞,延遲投遞,定時投遞。

異步投遞

同步發送:消息生產者使用持久(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教程

 

持續更新!!!

 


免責聲明!

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



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