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-11
java命令調(diào)用虛擬機(jī)方法總結(jié)
在本篇文章里我們給大家整理了關(guān)于java中的java命令如何調(diào)用虛擬機(jī)的方法和具體步驟,需要的朋友們跟著操作下。2019-05-05
springboot的http.server.requests服務(wù)請(qǐng)求流程源碼
這篇文章主要為大家介紹了springboot的http.server.requests服務(wù)請(qǐng)求流程源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
SpringBoot熔斷機(jī)制之CircuitBreaker詳解
這篇文章主要介紹了SpringBoot熔斷機(jī)制之CircuitBreaker詳解,SpringBoot的熔斷機(jī)制在微服務(wù)架構(gòu)中扮演著重要角色,其中CircuitBreaker是其核心機(jī)制之一,用于防止服務(wù)的異常狀態(tài)影響到整個(gè)系統(tǒng)的運(yùn)作,需要的朋友可以參考下2023-10-10
Java利用過(guò)濾器實(shí)現(xiàn)完善登錄功能
這篇文章主要為大家詳細(xì)介紹了Java如何利用過(guò)濾器實(shí)現(xiàn)完善登錄功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-09-09
java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)
這篇文章主要介紹了java實(shí)體類轉(zhuǎn)成map的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringBoot+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

