activeMQ - 消息重发策略和DLQ死信队列

news/2024/7/5 5:22:55

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1:死信队列简介

DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。
出现以下情况时,消息会被redelivered。

 A transacted session is used and rollback() is called.
 A transacted session is closed before commit is called.
 A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called.

当一个消息被redelivered超过maximumRedeliveries(缺省为6次,具体设置请参考后面的链接)次数时,会给broker发送一个"Poison ack",这个消息被认为是a poison pill,这时broker会将这个消息发送到DLQ,以便后续处理。

缺省情况下,死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列。

缺省情况下,持久消息过期,会被送到DLQ,非持久消息不会送到DLQ

可以通过配置文件(activemq.xml)来调整死信发送策略。

注:本次测试使用的是第三种,使用自行确认接收并且在失败时session.recover()进行恢复.

 

2:activemq.xml配置

死信队列配置

<destinationPolicy>  <policyMap>  <policyEntries>  <policyEntry queue=">">  <deadLetterStrategy>  <individualDeadLetterStrategy queuePrefix="DLQ."  useQueueForQueueMessages="true" />  </deadLetterStrategy>  </policyEntry>  <policyEntry topic=">" >                   <pendingMessageLimitStrategy>  <constantPendingMessageLimitStrategy limit="1000"/>  </pendingMessageLimitStrategy>  </policyEntry>  </policyEntries>  </policyMap>  
</destinationPolicy>  

3:RedeliveryPolicy重发策略设置

<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL" value="tcp://localhost:61636"></property><property name="useAsyncSend" value="true"></property><property name="redeliveryPolicy"><bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy"><!--是否在每次尝试重新发送失败后,增长这个等待时间--><property name="useExponentialBackOff" value="true"></property><!--重发次数,默认为6次--><property name="maximumRedeliveries" value="5"></property><!--重发时间间隔,默认为1秒--><property name="initialRedeliveryDelay" value="1000"></property><!--第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value--><property name="backOffMultiplier" value="2"></property><!--最大传送延迟,只在useExponentialBackOff为true时有效(V5.5),假设首次重连间隔为10ms,倍数为2,那么第 二次重连时间间隔为 20ms,第三次重连时间间隔为40ms,当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。--><property name="maximumRedeliveryDelay" value="1000"></property></bean></property>
</bean>

 

4:send测试类

public class ActiveMqSender extends BaseTest {@Autowiredprivate JmsTemplate senderJmsTemplate;@Testpublic void activeMq(){for(int i = 1;i<=10;i++){senderJmsTemplate.convertAndSend("FirstQueue","我是第"+i+"个");}System.out.print("全部执行完毕!!!");}
}

 

5:receiver测试类

public class ActiveMqReceiver extends BaseTest {@Autowiredprivate SimpleJmsTemplate receiverJmsTemplate;@Autowiredprivate ActiveMQQueue activeMQQueue;/*** 如果session事物设置为true,receiver直接将sessioin进行commit,* <p>* 如果设置为false,receiver方法会直接判断进行消息确认,无法做到手动的消息确认,所以一旦发生异常,这条消息不会回到消息队列中* <p>* session的提交可以认为是消息确认收到** @throws JMSException*/@Testpublic void recerver() throws JMSException {int i = 1;int j = 0;String eq = null;while (true) {i++;TextMessage message = (TextMessage) receiverJmsTemplate.receive(activeMQQueue);if (null != message) {String messageText = message.getText();eq = messageText;System.out.println("收到消息==================" + messageText);if (messageText.equals("我是第2个")) {try {throw new RuntimeException("Exception");} catch (Exception e) {System.out.println("第" + j + "次接收");j++;receiverJmsTemplate.getSessionToUse().recover();}}receiverJmsTemplate.msgAckAndcloseSession(message);} else {System.out.print("超时10秒");break;}}}
}

 

6:测试结果

收到消息==================我是第1个
收到消息==================我是第2个
第0次接收
收到消息==================我是第2个
第1次接收
收到消息==================我是第2个
第2次接收
收到消息==================我是第2个
第3次接收
收到消息==================我是第2个
第4次接收
收到消息==================我是第2个
第5次接收
收到消息==================我是第3个
收到消息==================我是第4个
收到消息==================我是第5个
收到消息==================我是第6个
收到消息==================我是第7个
收到消息==================我是第8个
收到消息==================我是第9个
收到消息==================我是第10个

这里第一次是默认的,后五次是配置的重新发送,当五次重新发送之后还是失败,那么将会进入死信队列,看下一步

 

7:死信队列结果

 

转载于:https://my.oschina.net/thinwonton/blog/997783


http://lihuaxi.xjx100.cn/news/241767.html

相关文章

Python培训分享:Python新版本中的6个新特性

Python在几年做了一个全面的升级&#xff0c;此次Python升级中有6个新特性&#xff0c;本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的&#xff0c;来看看下面的详细介绍。 Python培训分享&#xff1a;Python 3.10 有几个新的很酷的功能&#xff…

Get started with ros -- 1

原创博文&#xff1a;转载请标明出处&#xff08;周学伟&#xff09;&#xff1a;http://www.cnblogs.com/zxouxuewei/tag/ 一.Introduction&#xff1a; 机器人操作系统&#xff08;ROS&#xff09;是使机器人系统的不同部分能够发现&#xff0c;发送和接收数据的通信接口。MA…

UI培训分享:如何提升自己的UI设计能力

相信很多UI设计师在工作中经常会遇到瓶颈&#xff0c;那么如何提升自己的UI设计能力?是我们要思考的一个问题&#xff0c;下面小编就为大家分享—些建议。 UI培训分享&#xff1a;如何提升自己的UI设计能力 1、多看 国内知名的设计网站&#xff0c;比如站酷网、花瓣网、多看优…

(C++)1016 部分A+B 正整数

#include<cstdio>int main(){ //1.读入a,Da,b,Dblong long a,b,Pa0,Pb0;int Da,Db;scanf("%lld%d%lld%d",&a,&Da,&b,&Db); //2.对于a,遍历每一位&#xff0c;加在Pa上 //2.1取余的方式遍历while(a>0){if(a%10Da){Pa Pa*10 Da;}a a/10;} …

图像模式.通道案例

为什么80%的码农都做不了架构师&#xff1f;>>> 一、“位图”模式&#xff1a; 【擅长】&#xff1a;报版印刷&#xff1b; 位图是一位位深度的图片&#xff0c;只有 2^12 个颜色&#xff1b;通道也只有一个&#xff1b; 默认状态是禁用的&#xff0c;…

如何模拟编写MyBatis之DataSource与Session呢?

转自: 如何模拟编写MyBatis之DataSource与Session呢&#xff1f; 下文笔者讲述mybatis之模拟DateSource和Session的方法分享&#xff0c;如下所示 DataSource和Session简介 DataSource:实现标准的javax.sql.DataSource接口,用于获取数据库连接 Session:可以直接调用exec(sq…

Linux账户安全管理--useradd、groupadd、passwd、chown、chmod工具

groupadd-g 设置组id号实例&#xff1a; groupadd tomcatgroupadd -g600 tomcat删除组用groupdelgroupdel tomcatuseradd-c comment 给新用户添加备注 -d home_dir 为主目录指定一个名字&#xff08;如果不想用登录名作为主目录名的话&#xff09; -e expire_date 用Y…

参加UI培训后可以找什么工作

UI设计在近几年备受大家的关注&#xff0c;很多企业对UI设计这个岗位也显得尤为重要&#xff0c;很多人都想转型学习UI设计技术&#xff0c;大多数人选择参加UI培训机构进行系统学习&#xff0c;那么通过系统培训的同学参加UI培训后可以找什么工作呢?来看看下面的详细介绍。 参…