Springboot實(shí)現(xiàn)Activemq死信隊(duì)列詳解
死信隊(duì)列是什么
當(dāng)消息不能重投遞或者消息過(guò)期,會(huì)被移到死信隊(duì)列中,由管理員消費(fèi)。
可以進(jìn)行以下操作:
- delete:刪除記錄
- retry:重新投遞
- copy: 復(fù)制到一個(gè)選擇的隊(duì)列中。
- move:移動(dòng)到一個(gè)選擇的隊(duì)列中。
什么情況下消息會(huì)重投遞
消息重投遞的常用場(chǎng)景:
- 事務(wù)回滾
- 事務(wù)提交前close
- A client is using CLIENT_ACKNOWLEDGE on a Session and calls recover() on that Session.
重新投遞策略
RedeliveryPolicy policy = connection.getRedeliveryPolicy(); policy.setInitialRedeliveryDelay(500); policy.setBackOffMultiplier(2); policy.setUseExponentialBackOff(true); policy.setMaximumRedeliveries(2);
死信隊(duì)列
重新投遞 次數(shù)超過(guò) MaximumRedeliveries ,則會(huì)進(jìn)入死信隊(duì)列。
默認(rèn)情況,有一個(gè)死信隊(duì)列:AcitveMQ.DLQ,所有的消息都投遞到此隊(duì)列,包括過(guò)期消息,重投遞失敗消息。
Spring整合
Activemq服務(wù)端配置
重新投遞 次數(shù)超過(guò) MaximumRedeliveries ,則會(huì)進(jìn)入死信隊(duì)列。
默認(rèn)情況,有一個(gè)死信隊(duì)列:AcitveMQ.DLQ,所有的消息都投遞到此隊(duì)列,包括過(guò)期消息,重投遞失敗消息。
配置個(gè)性化死信隊(duì)列。
<destinationPolicy> <policyMap> <policyEntries> <policyEntry queue=">"> <deadLetterStrategy> <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true" processExpired="false" processNonPersistent="false"/> </deadLetterStrategy> </policyEntry> </policyEntries> </policyMap> </destinationPolicy>
可以單獨(dú)設(shè)置重投遞策略
@Bean public ActiveMQConnectionFactoryCustomizer myCustomizer2() { return new ActiveMQConnectionFactoryCustomizer() { /** * Customize the {@link ActiveMQConnectionFactory}. * * @param factory the factory to customize */ @Override public void customize(ActiveMQConnectionFactory factory) { //設(shè)置了隊(duì)列的 policy。 ActiveMQQueue q = new ActiveMQQueue("queue.dlq.test"); RedeliveryPolicy policy = new RedeliveryPolicy(); policy.setMaximumRedeliveries(3); factory.getRedeliveryPolicyMap().put(q,policy); System.out.println("Customizer 2"); } }; }
觸發(fā)重投遞
代碼回滾
@JmsListener(destination = "queue.dlq.test" ,id = "test") public void consume(String param, Session session) { try { System.out.println(session.getAcknowledgeMode()); System.out.println(param); //回滾,則重投遞 session.rollback(); }catch (Exception ex){ } }
拋出異常自動(dòng)回滾
由于默認(rèn)是開(kāi)啟事務(wù)的,因此拋出異常,會(huì)自動(dòng)觸發(fā)回滾。
@JmsListener(destination = "queue.dlq.test2",id="test2") public void consume2(String param, Session session) { System.out.println(param); throw new RuntimeException("xxxx"); }
//AbstractMessageListenerContainer protected void doExecuteListener(Session session, Message message) throws JMSException { if (!isAcceptMessagesWhileStopping() && !isRunning()) { if (logger.isWarnEnabled()) { logger.warn("Rejecting received message because of the listener container " + "having been stopped in the meantime: " + message); } rollbackIfNecessary(session); throw new MessageRejectedWhileStoppingException(); } try { invokeListener(session, message); } //JMSException,RuntimeException,Error 這3類異常會(huì)回滾。 catch (JMSException | RuntimeException | Error ex) { //自動(dòng)回滾 rollbackOnExceptionIfNecessary(session, ex); throw ex; } //自動(dòng)提交 commitIfNecessary(session, message); }
其他的Exception 都會(huì)被包裝成ListenerExecutionFailedException,它是JMSException的子類,所以所有異常都會(huì)導(dǎo)致回滾。
到此這篇關(guān)于Springboot實(shí)現(xiàn)Activemq死信隊(duì)列詳解的文章就介紹到這了,更多相關(guān)Activemq死信隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析
這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12詳解Java字節(jié)碼編程之非常好用的javassist
這篇文章主要介紹了詳解Java字節(jié)碼編程之非常好用的javassist,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04關(guān)于@JSONField和@JsonFormat的使用區(qū)別說(shuō)明
這篇文章主要介紹了關(guān)于@JSONField 和 @JsonFormat的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java命令調(diào)用虛擬機(jī)方法總結(jié)
在本篇文章里我們給大家整理了關(guān)于java中的java命令如何調(diào)用虛擬機(jī)的方法和具體步驟,需要的朋友們跟著操作下。2019-05-05springboot的http.server.requests服務(wù)請(qǐng)求流程源碼
這篇文章主要為大家介紹了springboot的http.server.requests服務(wù)請(qǐng)求流程源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12SpringBoot熔斷機(jī)制之CircuitBreaker詳解
這篇文章主要介紹了SpringBoot熔斷機(jī)制之CircuitBreaker詳解,SpringBoot的熔斷機(jī)制在微服務(wù)架構(gòu)中扮演著重要角色,其中CircuitBreaker是其核心機(jī)制之一,用于防止服務(wù)的異常狀態(tài)影響到整個(gè)系統(tǒng)的運(yùn)作,需要的朋友可以參考下2023-10-10Java利用過(guò)濾器實(shí)現(xiàn)完善登錄功能
這篇文章主要為大家詳細(xì)介紹了Java如何利用過(guò)濾器實(shí)現(xiàn)完善登錄功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-09-09java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)
這篇文章主要介紹了java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法
這篇文章主要介紹了SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03