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

