Springboot實(shí)現(xiàn)Activemq死信隊(duì)列詳解
死信隊(duì)列是什么
當(dāng)消息不能重投遞或者消息過期,會被移到死信隊(duì)列中,由管理員消費(fèi)。
可以進(jìn)行以下操作:
- delete:刪除記錄
- retry:重新投遞
- copy: 復(fù)制到一個選擇的隊(duì)列中。
- move:移動到一個選擇的隊(duì)列中。
什么情況下消息會重投遞
消息重投遞的常用場景:
- 事務(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ù)超過 MaximumRedeliveries ,則會進(jìn)入死信隊(duì)列。
默認(rèn)情況,有一個死信隊(duì)列:AcitveMQ.DLQ,所有的消息都投遞到此隊(duì)列,包括過期消息,重投遞失敗消息。
Spring整合
Activemq服務(wù)端配置
重新投遞 次數(shù)超過 MaximumRedeliveries ,則會進(jìn)入死信隊(duì)列。
默認(rèn)情況,有一個死信隊(duì)列:AcitveMQ.DLQ,所有的消息都投遞到此隊(duì)列,包括過期消息,重投遞失敗消息。
配置個性化死信隊(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){ } }
拋出異常自動回滾
由于默認(rèn)是開啟事務(wù)的,因此拋出異常,會自動觸發(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類異常會回滾。 catch (JMSException | RuntimeException | Error ex) { //自動回滾 rollbackOnExceptionIfNecessary(session, ex); throw ex; } //自動提交 commitIfNecessary(session, message); }
其他的Exception 都會被包裝成ListenerExecutionFailedException,它是JMSException的子類,所以所有異常都會導(dǎo)致回滾。
到此這篇關(guān)于Springboot實(shí)現(xiàn)Activemq死信隊(duì)列詳解的文章就介紹到這了,更多相關(guān)Activemq死信隊(duì)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析
這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12詳解Java字節(jié)碼編程之非常好用的javassist
這篇文章主要介紹了詳解Java字節(jié)碼編程之非常好用的javassist,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04關(guān)于@JSONField和@JsonFormat的使用區(qū)別說明
這篇文章主要介紹了關(guān)于@JSONField 和 @JsonFormat的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11java命令調(diào)用虛擬機(jī)方法總結(jié)
在本篇文章里我們給大家整理了關(guān)于java中的java命令如何調(diào)用虛擬機(jī)的方法和具體步驟,需要的朋友們跟著操作下。2019-05-05springboot的http.server.requests服務(wù)請求流程源碼
這篇文章主要為大家介紹了springboot的http.server.requests服務(wù)請求流程源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12SpringBoot熔斷機(jī)制之CircuitBreaker詳解
這篇文章主要介紹了SpringBoot熔斷機(jī)制之CircuitBreaker詳解,SpringBoot的熔斷機(jī)制在微服務(wù)架構(gòu)中扮演著重要角色,其中CircuitBreaker是其核心機(jī)制之一,用于防止服務(wù)的異常狀態(tài)影響到整個系統(tǒng)的運(yùn)作,需要的朋友可以參考下2023-10-10java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)
這篇文章主要介紹了java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot+jsp項(xiàng)目啟動出現(xiàn)404的解決方法
這篇文章主要介紹了SpringBoot+jsp項(xiàng)目啟動出現(xiàn)404的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03