Springboot實(shí)現(xiàn)Activemq死信隊(duì)列詳解
死信隊(duì)列是什么
當(dāng)消息不能重投遞或者消息過期,會(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ù)超過 MaximumRedeliveries ,則會(huì)進(jìn)入死信隊(duì)列。
默認(rèn)情況,有一個(gè)死信隊(duì)列:AcitveMQ.DLQ,所有的消息都投遞到此隊(duì)列,包括過期消息,重投遞失敗消息。
Spring整合
Activemq服務(wù)端配置
重新投遞 次數(shù)超過 MaximumRedeliveries ,則會(huì)進(jìn)入死信隊(duì)列。
默認(rèn)情況,有一個(gè)死信隊(duì)列:AcitveMQ.DLQ,所有的消息都投遞到此隊(duì)列,包括過期消息,重投遞失敗消息。
配置個(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)是開啟事務(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)文章
Spring Boot 整合mybatis 與 swagger2
之前使用springMVC+spring+mybatis,總是被一些繁瑣的xml配置,還經(jīng)常出錯(cuò),下面把以前的一些ssm項(xiàng)目改成了spring boot + mybatis,相對(duì)于來說優(yōu)點(diǎn)太明顯了,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧2017-08-08
java求100以內(nèi)的素?cái)?shù)示例分享
素?cái)?shù)是指因數(shù)只有1和本身的數(shù)字,這篇文章主要介紹了java求100以內(nèi)的素?cái)?shù)示例,需要的朋友可以參考下2014-03-03
Java19新特性中外部函數(shù)與內(nèi)存API
Java19引入的外部函數(shù)與內(nèi)存API(預(yù)覽功能)是Project Panama一部分,旨在簡(jiǎn)化Java與本地代碼及非堆內(nèi)存的交互,提供更低層次的編程能力,解決了傳統(tǒng)JNI調(diào)用的復(fù)雜性、安全性和性能局限,特別適合高性能計(jì)算和系統(tǒng)編程領(lǐng)域,感興趣的可以了解一下2024-09-09
SpringBoot項(xiàng)目從開發(fā)到打包發(fā)布的完整教程
本文手把手帶你從零搭建 SpringBoot 項(xiàng)目,實(shí)現(xiàn)Redis 緩存 + MySQL 日志 + 第三方接口調(diào)用,并完成服務(wù)器打包部署,全程與 Node.js 對(duì)比,新手也能快速上手,需要的朋友可以參考下2026-04-04
IntelliJ IDEA2019實(shí)現(xiàn)Web項(xiàng)目創(chuàng)建示例
這篇文章主要介紹了IntelliJ IDEA2019實(shí)現(xiàn)Web項(xiàng)目創(chuàng)建示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Spring之動(dòng)態(tài)注冊(cè)bean的實(shí)現(xiàn)方法
這篇文章主要介紹了Spring之動(dòng)態(tài)注冊(cè)bean的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08

