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死信队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JVM内存结构划分实例解析

    JVM内存结构划分实例解析

    这篇文章主要介绍了JVM内存结构划分实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 详解Java字节码编程之非常好用的javassist

    详解Java字节码编程之非常好用的javassist

    这篇文章主要介绍了详解Java字节码编程之非常好用的javassist,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 关于@JSONField和@JsonFormat的使用区别说明

    关于@JSONField和@JsonFormat的使用区别说明

    这篇文章主要介绍了关于@JSONField 和 @JsonFormat的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java命令调用虚拟机方法总结

    java命令调用虚拟机方法总结

    在本篇文章里我们给大家整理了关于java中的java命令如何调用虚拟机的方法和具体步骤,需要的朋友们跟着操作下。
    2019-05-05
  • Spring实现泛型注入的示例详解

    Spring实现泛型注入的示例详解

    Spring 4.0版本中更新了很多新功能,其中比较重要的一个就是对带泛型的Bean进行依赖注入的支持。本文将通过实例详细讲讲Spring如何实现泛型注入,需要的可以参考一下
    2022-07-07
  • springboot的http.server.requests服务请求流程源码

    springboot的http.server.requests服务请求流程源码

    这篇文章主要为大家介绍了springboot的http.server.requests服务请求流程源码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • SpringBoot熔断机制之CircuitBreaker详解

    SpringBoot熔断机制之CircuitBreaker详解

    这篇文章主要介绍了SpringBoot熔断机制之CircuitBreaker详解,SpringBoot的熔断机制在微服务架构中扮演着重要角色,其中CircuitBreaker是其核心机制之一,用于防止服务的异常状态影响到整个系统的运作,需要的朋友可以参考下
    2023-10-10
  • Java利用过滤器实现完善登录功能

    Java利用过滤器实现完善登录功能

    这篇文章主要为大家详细介绍了Java如何利用过滤器实现完善登录功能,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-09-09
  • java实体类转成map的实现

    java实体类转成map的实现

    这篇文章主要介绍了java实体类转成map的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBoot+jsp项目启动出现404的解决方法

    SpringBoot+jsp项目启动出现404的解决方法

    这篇文章主要介绍了SpringBoot+jsp项目启动出现404的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03

最新评论