ActiveMQ Redelivery Policy(消息重发策略)

2023-11-02

官方文档: http://activemq.apache.org/redelivery-policy.html
在事务控制里抛出异常,txManager会进行rollback处理.(在activeMQ里,消息默认会redelivery到客户端6次,如果继续异常,消息会放到deadletter queue里(ActiveMQ.DLQ))。

在以下三种情况中,消息会被再次传送给消费者:

1.在使用事务的Session中,调用rollback()方法;

2.在使用事务的Session中,调用commit()方法之前就关闭了Session;

3.在Session中使用CLIENT_ACKNOWLEDGE签收模式,并且调用了recover()方法。

可以通过设置ActiveMQConnectionFactoryActiveMQConnection来定制想要的再次传送策略。

当消息被再次投递到客户端时的详细信息在  Message Redelivery and DLQ Handling  章节能找到详细的说明。
你可以在ActiveMQConnectionFactory 或ActiveMQConnection类中配置RedeliveryPolicy属性,用来定义重传策略的具体细节。
您可以使用Java代码,Spring配置或配置URI字符串来定义重传策略。

可用的属性

 属性 默认值 说明 
 collisionAvoidanceFactor  0.15  设置防止冲突范围的正负百分比,只有启用useCollisionAvoidance参数时才生效。也就是在延迟时间上再加一个时间波动范围。
 maximumRedeliveries  6  最大重传次数,达到最大重连次数后抛出异常。为-1时不限制次数,为0时表示不进行重传。
 maximumRedeliveryDelay  -1  最大传送延迟,只在useExponentialBackOff为true时有效(V5.5),假设首次重连间隔为10ms,倍数为2,那么第二次重连时间间隔为 20ms,第三次重连时间间隔为40ms,当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。
 initialRedeliveryDelay  1000L  初始重发延迟时间
 redeliveryDelay  1000L  重发延迟时间,当initialRedeliveryDelay=0时生效(v5.4)
 useCollisionAvoidance  false  启用防止冲突功能,因为消息接收时是可以使用多线程并发处理的,应该是为了重发的安全性,避开所有并发线程都在同一个时间点进行消息接收处理。所有线程在同一个时间点处理时会发生什么问题呢?应该没有问题,只是为了平衡broker处理性能,不会有时很忙,有时很空闲。
 useExponentialBackOff  false  启用指数倍数递增的方式增加延迟时间。
 backOffMultiplier  5  重连时间间隔递增倍数,只有值大于1和启用useExponentialBackOff参数时才生效。

官方文档有些参数功能说得不是很清楚,如collisionAvoidanceFactor,那只能查看源代码了,
可以查看org.apache.activemq.ActiveMQMessageConsumer类中的rollback()方法:

public void rollback() throws JMSException {

......

final int currentRedeliveryCount = lastMd.getMessage().getRedeliveryCounter(); if (currentRedeliveryCount > 0) { redeliveryDelay = redeliveryPolicy.getNextRedeliveryDelay(redeliveryDelay); } else { redeliveryDelay = redeliveryPolicy.getInitialRedeliveryDelay(); }

......

}

先获取重发次数,如果是第一次重发则延迟时间为initialRedeliveryDelay,如果不是第一次重发则延迟时间为redeliveryDelay = redeliveryPolicy.getNextRedeliveryDelay(redeliveryDelay);这里的redeliveryDelay参数是前一次重发的延迟时间。

public long getNextRedeliveryDelay(long previousDelay) { long nextDelay; if (previousDelay == 0) { nextDelay = redeliveryDelay; } else if (useExponentialBackOff && backOffMultiplier > 1) { nextDelay = (long) (previousDelay * backOffMultiplier); if(maximumRedeliveryDelay != -1 && nextDelay > maximumRedeliveryDelay) { // in case the user made max redelivery delay less than redelivery

delay for some reason. nextDelay = Math.max(maximumRedeliveryDelay, redeliveryDelay); } } else { nextDelay = previousDelay; } if (useCollisionAvoidance) { /* * First random determines +/-, second random determines how far to * go in that direction. -cgs */ Random random = getRandomNumberGenerator(); double variance = (random.nextBoolean() ? collisionAvoidanceFactor :

-collisionAvoidanceFactor) * random.nextDouble(); nextDelay += nextDelay * variance; } return nextDelay; }

计算下一次重发延迟时间时,当启用指数倍数增长方式useExponentialBackOff=true,且增长倍数backOffMultiplier > 1时,下一次延迟时间为previousDelay * backOffMultiplier,这里的previousDelay为前一次延迟重发的时间。

collisionAvoidanceFactor这个参数spring中是不能直接注入的,注入方法为:

public void setCollisionAvoidancePercent(short collisionAvoidancePercent) { this.collisionAvoidanceFactor = collisionAvoidancePercent * 0.01d; }

这里的collisionAvoidancePercent是个短整形,比如15,则方法直接计算为15%。在spring中注入方式为:

<property name="collisionAvoidancePercent" value="15" />

如果useCollisionAvoidance=true,则nextDelay += nextDelay * variance;这里的variance是一个随机的正负值,Random.nextDouble()的范围是:0.0d到1.0d,当redeliveryDelay=1000L,collisionAvoidanceFactor值为0.15时,那么正负variance的范围就是:-0.15到+0.15,那么最后nextDelay的值范围就是:1000+1000*-15%~1000+1000*15%,即在850~1150范围内波动。

这里延时有两个参数没看明白用途,正常一个参数就可以了:关于initialRedeliveryDelay和redeliveryDelay。

从测试结果看:

当initialRedeliveryDelay>0,redeliveryDelay>0时,延时时间是按initialRedeliveryDelay的,包括第一次。

当initialRedeliveryDelay=0,redeliveryDelay>0时,延时时间第一次重发时却是按DefaultMessageListenerContainer的receiveTimeout和recoveryInterval参数的值进行重发的,以后才是按redeliveryDelay递增时间重发的。

且:

当receiveTimeout小于recoveryInterval时,第一次延迟时间为receiveTimeout时间,

当receiveTimeout大于recoveryInterval时,第一次延迟时间为recoveryInterval时间。


http://windows9834.blog.163.com/blog/static/2734500420131195224532/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ActiveMQ Redelivery Policy(消息重发策略) 的相关文章

随机推荐

  • FPGA的基础结构

    深入理解 FPGA 的基础结构 知乎 zhihu com 原理和结构 FPGA的构成要素 逻辑要素 逻辑块 Logic Block LB 用于实现逻辑电路 可编程逻辑的逻辑块的实现方式有乘积项 查找表 数据选择器 Multiplexer M
  • 搭建三节点的kubernetes(K8S)集群

    Kubernates安装配置文档 先决条件 1 需要的yaml文件所在的github地址如下 https github com luckylucky421 kubernetes1 17 3 tree master 2 下文里初始化k8s集群
  • Jupyter notebook快速入门教程

    本篇将给大家介绍一款超级好用的工具 Jupyter notebook 为什么要介绍这款工具呢 如果你想使用Python学习数据分析或数据挖掘 那么它应该是你第一个应该知道并会使用的工具 它很容易上手 用起来非常方便 是个对新手非常友好的工具
  • Matlab快速创建矩阵的方法(创建特殊矩阵)

    在matlab的使用过程中经常会需要用到矩阵 有时想要创建一些数据比较多的矩阵 对矩阵的内容要求可能并不高或者要创建一些特殊矩阵 下面将提供一些matlab内部提供的一些快速创建矩阵的方法 1 创建单位矩阵 eye n 创建n n的单位矩阵
  • GitHub托管HTML页面,让其他人轻松访问自己的页面

    如何通过GitHub来托管自己写的HTML页面 能够轻松让其他人访问你的页面 还可以通过GitHub让多人参与进来你的项目 以下是详细步骤 1 创建账户 登陆https github com 注册成功 1 https guides gith
  • SpringBoot2.0学习笔记:(九) Spring Boot中集成Mybatis与Druid

    一 项目的搭建 Druid对Spring boot做了很好的适配 所有的工作都只需要在配置文件中完成 具体的Druid在Spring Boot中的配置可以看 GitHub文档 首先看一下项目引入的jar包
  • flink学习46:flinkSQL自定义函数

    标量函数 实例 表值函数 聚合函数
  • 点击登录按钮弹出登录模态框

  • 拯救者y7000笔记本VMware虚拟机打开蓝屏问题

    VMware虚拟机安装后开启虚拟机蓝屏检查步骤 一 必须确定你的CPU开启了虚拟化才行 要先开启虚拟化再去控制面板里设置 查看是否开启虚拟化方法 在win10系统最下方任务栏空白处 右键鼠标打开任务管理器 也可以点击快捷键Ctrl Alt
  • go语言实现邮件发送

    go语言实现邮件发送 安装相关的包 go get github com jordan wright email 代码篇 package main import fmt github com jordan wright email log n
  • Zotero软件与ChatGPT连用模版

    Zotero软件与ChatGPT连用模版 整体流程 其他配置 全文 AskPDF position 10 color 0EA293 trigger 本文 这篇文章 论文 You are a helpful assistant Context
  • 缓存一致性问题解决方案

    通常情况下 我们使用缓存的主要目的是为了提升查询的性能 大多数情况下 是这样使用缓存的 当数据库有数据更新时 在很长的一段时间内 决定于缓存的过期时间 用户请求从缓存中获取到的都可能是旧值 而非数据库的最新值 那么 该如何更新缓存呢 目前有
  • Python实现电商订单的数据分析

    一 数据信息 数据集 阿里云天池 数据来源 说明 本数据集共有104557条数据 共计11个字段 字段 id 序号 orderID 订单id userID 用户id goodsID 商品id orderAmount 订单总额 payment
  • 【Python刷题】P1

    Python刷题P1 第一题 第二题 第一题 1 给定一个非空的字符串 s 检查是否可以通过由它的一个子串重复多次构成 示例 1 输入 s abab 输出 true 解释 可由子串 ab 重复两次构成 示例 2 输入 s aba 输出 fa
  • C语言程序设计(谭浩强第五版)——例题

    C语言程序设计 谭浩强第五版 例题 第1章 程序设计和C语言 第2章 算法 程序的灵魂 第3章 最简单的C程序设计 顺序程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 利用数组处理批量数据 第7章 用函数实现模块化程序
  • 【算法基础】基于pytorch的BP神经网络算法代码+数据集

    实现功能 1 数据回归 基于多输入单输出数据集 2 代码最后使用matplotlib绘制了 训练次数 loss值 折线图进行训练结果展示 注 1 代码亲测可成功运行 2 以下代码通过cuda调用GPU训练 如果cuda报错则需检查GPU训练
  • python基础学习06_if条件判断(多重判断、嵌套、三目运算)

    一 条件语句 条件成立执行某些代码 条件不成立执行哪些代码 二 IF 条件判断 IF简单条件判断 多重判断 IF嵌套 三目运算符 1 if 简单条件判断 if if True print 条件成 执 的代码1 print 条件成 执 的代码
  • 微信小程序开发记录(一)弹出框和模态框介绍

    弹出框和模态框的简介和使用方法如下
  • k8s踩坑2——scheduler 、controller-manager Unhealthy

    查看master组件状态时出现错误 root k8s master kubectl get cs Warning v1 ComponentStatus is deprecated in v1 19 NAME STATUS MESSAGE E
  • ActiveMQ Redelivery Policy(消息重发策略)

    官方文档 http activemq apache org redelivery policy html 在事务控制里抛出异常 txManager会进行rollback处理 在activeMQ里 消息默认会redelivery到客户端6次