Springboot实现Activemq死信队列详解

 更新时间:2023年12月13日 08:52:32   作者:demon7552003  
这篇文章主要介绍了Springboot实现Activemq死信队列详解,Activemq服务端配置重新投递次数超过 MaximumRedeliveries ,则会进入死信队列,默认情况,有一个死信队列:AcitveMQ.DLQ,所有的消息都投递到此队列,包括过期消息,重投递失败消息,需要的朋友可以参考下

死信队列是什么

当消息不能重投递或者消息过期,会被移到死信队列中,由管理员消费。

可以进行以下操作:

  • delete:删除记录
  • retry:重新投递
  • copy: 复制到一个选择的队列中。
  • move:移动到一个选择的队列中。

image-20221021142625060

什么情况下消息会重投递

消息重投递的常用场景:

  • 事务回滚
  • 事务提交前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);

死信队列

重新投递 次数超过 MaximumRedeliveries ,则会进入死信队列。

默认情况,有一个死信队列:AcitveMQ.DLQ,所有的消息都投递到此队列,包括过期消息,重投递失败消息。

Spring整合

Activemq服务端配置

重新投递 次数超过 MaximumRedeliveries ,则会进入死信队列。

默认情况,有一个死信队列:AcitveMQ.DLQ,所有的消息都投递到此队列,包括过期消息,重投递失败消息。

配置个性化死信队列。

<destinationPolicy>
    <policyMap>
        <policyEntries>
            <policyEntry queue=">">
                <deadLetterStrategy>
                  <individualDeadLetterStrategy queuePrefix="DLQ."
                  useQueueForQueueMessages="true"
                  processExpired="false"
                  processNonPersistent="false"/>
                </deadLetterStrategy>
            </policyEntry>
        </policyEntries>
    </policyMap>
</destinationPolicy>

可以单独设置重投递策略

    @Bean
    public ActiveMQConnectionFactoryCustomizer myCustomizer2() {
        return new ActiveMQConnectionFactoryCustomizer() {

            /**
             * Customize the {@link ActiveMQConnectionFactory}.
             *
             * @param factory the factory to customize
             */
            @Override
            public void customize(ActiveMQConnectionFactory factory) {

                //设置了队列的 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");
            }
        };
    }

触发重投递

代码回滚

 @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){

        }
    }

抛出异常自动回滚

由于默认是开启事务的,因此抛出异常,会自动触发回滚。

@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的子类,所以所有异常都会导致回滚。

到此这篇关于Springboot实现Activemq死信队列详解的文章就介绍到这了,更多相关Activemq死信队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Security登陆流程讲解

    Spring Security登陆流程讲解

    本文主要介绍了Spring Security登陆流程讲解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring Boot 整合mybatis 与 swagger2

    Spring Boot 整合mybatis 与 swagger2

    之前使用springMVC+spring+mybatis,总是被一些繁琐的xml配置,还经常出错,下面把以前的一些ssm项目改成了spring boot + mybatis,相对于来说优点太明显了,具体内容详情大家通过本文学习吧
    2017-08-08
  • java求100以内的素数示例分享

    java求100以内的素数示例分享

    素数是指因数只有1和本身的数字,这篇文章主要介绍了java求100以内的素数示例,需要的朋友可以参考下
    2014-03-03
  • Java Record类介绍及使用方法详解

    Java Record类介绍及使用方法详解

    Record是Java新增的库类,在Java 14和Java 15中以预览(preview)形式公布,这篇文章主要介绍了Java Record类介绍及使用方法的相关资料,需要的朋友可以参考下
    2025-08-08
  • Java19新特性中外部函数与内存API

    Java19新特性中外部函数与内存API

    Java19引入的外部函数与内存API(预览功能)是Project Panama一部分,旨在简化Java与本地代码及非堆内存的交互,提供更低层次的编程能力,解决了传统JNI调用的复杂性、安全性和性能局限,特别适合高性能计算和系统编程领域,感兴趣的可以了解一下
    2024-09-09
  • 2021年最新Redis面试题汇总(1)

    2021年最新Redis面试题汇总(1)

    在程序员面试过程中redis相关的知识是常被问到的话题。这篇文章主要介绍了几道Redis面试题,整理一下分享给大家,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot项目从开发到打包发布的完整教程

    SpringBoot项目从开发到打包发布的完整教程

    本文手把手带你从零搭建 SpringBoot 项目,实现Redis 缓存 + MySQL 日志 + 第三方接口调用,并完成服务器打包部署,全程与 Node.js 对比,新手也能快速上手,需要的朋友可以参考下
    2026-04-04
  • IntelliJ IDEA2019实现Web项目创建示例

    IntelliJ IDEA2019实现Web项目创建示例

    这篇文章主要介绍了IntelliJ IDEA2019实现Web项目创建示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java中Arrays工具类的一些常见方法总结

    Java中Arrays工具类的一些常见方法总结

    在Java中Arrays类是一个实用工具类,用于在数组上执行各种操作,包括排序、搜索、比较等,这篇文章主要给大家介绍了关于Java中Arrays工具类的一些常见方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Spring之动态注册bean的实现方法

    Spring之动态注册bean的实现方法

    这篇文章主要介绍了Spring之动态注册bean的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论