消息重试_dancheren的博客-程序员宅基地_action.commitmessage

技术标签: MQ消息队列  MQ  

MQ 消息重试

本文档主要介绍 MQ 消费者的消费逻辑失败时,通过设置返回状态可达到消息重试的结果。

MQ 消息重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继续消费新的消息。

重试次数

MQ 默认允许每条消息最多重试 16 次,每次重试的间隔时间如下:

第几次重试 每次重试间隔时间 第几次重试 每次重试间隔时间
1 10 秒 9 7 分钟
2 30 秒 10 8 分钟
3 1 分钟 11 9 分钟
4 2 分钟 12 10 分钟
5 3 分钟 13 20 分钟
6 4 分钟 14 30 分钟
7 5 分钟 15 1 小时
8 6 分钟 16 2 小时

如果消息重试16次后仍然失败,消息将不再投递。如果严格按照上述重试时间间隔计算,某条消息在一直消费失败的前提下,将会在接下来的4小时46分钟之内进行16次重试,超过这个时间范围消息将不再重试投递。

注意: 一条消息无论重试多少次,这些重试消息的 MessageID 不会改变。

配置方式

消费失败后,重试配置方式

集群消费方式下,消息消费失败后期望消息重试,需要在消息监听器接口的实现中明确进行配置(三种方式任选一种):

  • 返回 Action.ReconsumeLater (推荐)
  • 返回 Null
  • 抛出异常

代码示例如下:

 
  
  1. public class MessageListenerImpl implements MessageListener {
  2. @Override
  3. public Action consume(Message message, ConsumeContext context) {
  4. //方法3:消息处理逻辑抛出异常,消息将重试
  5. doConsumeMessage(message);
  6. //方式1:返回 Action.ReconsumeLater, 消息将重试
  7. return Action.ReconsumeLater;
  8. //方式2:返回 null, 消息将重试
  9. return null;
  10. //方式3:直接抛出异常 , 消息将重试
  11. throw new RuntimeException("Consumer Message exceotion");
  12. }
  13. }

消费失败后,不重试配置方式

集群消费方式下,消息失败后期望消息不重试,需要捕获消费逻辑中可能抛出的异常,最终返回 Action.CommitMessage,此后这条消息将不会再重试。代码示例如下:

 
  
  1. public class MessageListenerImpl implements MessageListener {
  2. @Override
  3. public Action consume(Message message, ConsumeContext context) {
  4. try {
  5. doConsumeMessage(message);
  6. } catch (Throwable e) {
  7. //捕获消费逻辑中的所有异常 , 并返回 Action.CommitMessage;
  8. return Action.CommitMessage;
  9. }
  10. //消息处理正常 , 直接返回 Action.CommitMessage;
  11. return Action.CommitMessage;
  12. }
  13. }

自定义消息最大重试次数

自定义 MQ 客户端日志配置,请升级 TCP Java SDK 版本到1.2.2及以上。

MQ 允许 Consumer 启动的时候设置最大重试次数,重试时间间隔将按照如下策略:

  • 最大重试次数小于等于16次,则重试时间间隔同上表描述。
  • 最大重试次数大于16次,超过16次的重试时间间隔均为每次2小时。

配置方式如下:

 
  
  1. Properties properties = new Properties();
  2. //配置对应 Consumer ID 的最大消息重试次数为20 次
  3. properties.put(PropertyKeyConst.MaxReconsumeTimes,20);
  4. Consumer consumer =ONSFactory.createConsumer(properties);

注意:

  • 消息最大重试次数的设置对相同 Consumer ID 下的所有 Consumer 实例有效。
  • 如果只对配置了相同 Consumer ID 的两个 Consumer 实例中的其中一个设置了 MaxReconsumeTimes,那么该配置对两个 Consumer 实例均生效。
  • 配置采用覆盖的方式生效,即最后启动的 Consumer 实例会覆盖之前的启动实例的配置。

获取消息重试次数

消费者收到消息后,可按照如下方式获取消息的重试次数:

 
  
  1. public class MessageListenerImpl implements MessageListener {
  2. @Override
  3. public Action consume(Message message, ConsumeContext context) {
  4. //获取消息的重试次数
  5. System.out.println(message.getReconsumeTimes());
  6. return Action.CommitMessage;
  7. }
  8. }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dancheren/article/details/71325437

智能推荐

原生开发小程序 和 wepy 、 mpvue 对比_FE-阿阳的博客-程序员宅基地

原生开发小程序 和 wepy 、 mpvue 对比 本文横向对比、探讨了下原生开发小程序,和目前比较热门的 wepy 、mpvue 开发小程序三种方式的优势和劣势;由于三者的篇幅都比较多,本文只是简单介绍。如有错误,请大神们指正。三者的开发文档以及介绍:原生开发小程序文档:点此进入 wepy 开发文档:点此进入 mpvue 开发文档:点此进入 三者的简单对比:...

HTML5的一些新特性学习_Amy_home的博客-程序员宅基地

HTML5带来了一些新的特性,总结如下:1. 新的文档类型(New Doctype)XHTML 1.0的声明方式:HTML5的声明方式:2. 脚本和链接无需type (No more types for scripts and links)在HTML4和XHTML中,需要用以下几行代码来添加js和css文件:在HTML5中,不需要再指定类型属性,如下:3.

如何在UEFI模式下安装win10和Ubuntu双系统,记录一下午的失败到成功_yang625624461的博客-程序员宅基地_win10下uefi安装ubuntu双系统

背景朋友拿来一台电脑,双系统win10和ubuntu,加装了一个sata固态盘后,用某分区助手尝试把系统盘拷贝到新固态盘,失败,仍然从机械盘读取系统。我拿到后,尝试进入pe系统修复引导,甚至于重装系统到固态硬盘后(怀疑是因为此时没有重新建MSR盘,而且原系统盘也保留着),均失效,仍然从机械硬盘读系统。于是让朋友备份好重要数据资料后,决定大刀阔斧,没有后顾之忧的操作了。首先全盘格式化,重新分...

java自动化测试面向对象之抽象类_玄链教育的博客-程序员宅基地

java自动化测试面向对象之抽象类文章目录java自动化测试面向对象之抽象类一、Java 抽象类一、Java 抽象类在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

codewars练习(javascript)-2021/1/18_Zella Zhang的博客-程序员宅基地

codewars-js练习2021/1/18【1】In this kata you will create a function that takes a list of non-negative integers and strings and returns a new list with the strings filtered out.(即删除数组中的字符串)example:filter_list([1,2,'a','b']) == [1,2]filter_list([1,'a','b',

采购订单审批BAPI ---BAPI_PO…_SAP_森林木的博客-程序员宅基地

采购订单审批BAPI---BAPI_PO_RELEASE REPORT  z_release_po.DATA gc_frggr LIKE ekko-frggr.                                     "Release GroupDATA gc_frgsx LIKE ekko-frgsx.                                

随便推点

拨打电话的礼仪_SZ laoluo的博客-程序员宅基地

 在商务交往中,普普通通的接打电话,实际上是在为通话者所在的单位、为通话者本人绘制一个给人深刻印象的电话形象。  所谓电话形象,即人们在通电话的整个过程之中的语言、声调、内容、表情、态度、时间感等的集合。它能够真实地体现出个人的素质、待人接物的态度以及通话者所在单位的整体水平。  与日常会话和书信联络相比,接打电话具有即时性、经常性、简洁性、双向性、礼仪性等较为突出的特点。所谓即时性、经常性、简洁

不再以讹传讹,GET和POST的真正区别_zndy10的博客-程序员宅基地

如果有人问你,GET和POST,有什么区别?你会如何回答?我的经历前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把GET改个名字叫GET2。他反问道,那就是单纯的名字上的区别喽?我想了想,我觉得如果说再具体的区别,只能去看RFC文档了,

python mysql pooleddb_Python 数据库连接池PooledDB_静茉不语的博客-程序员宅基地

1、应用环境数据库连接池,主要用于多线程,为了防止多线程同时对数据库进行操作出现混乱。2、使用2.1安装pip install DBUtils2.2、导入from dbutils.pooled_db import PooledDB2.3、创建数据库连接池对象self.mysql_pool_list = PooledDB(creator=pymysql,#数据库类型maxcached=200,#最大...

python--应用场景--网络爬虫_chidouhu7991的博客-程序员宅基地

一、抓取百度首页提取标题内容 #!/usr/bin/env python#-*- coding:utf-8 -*-from lxml import htmlimport requests#抓取html页面url = 'https://www.baidu.com/'...

转 sqlplus/RMAN/lsnrctl 等工具连接缓慢_weixin_34248849的博客-程序员宅基地

AIX上sqlplus /as sysdba rman target / 或者lsnrctl start时或者通过sqlplus system/[email protected]这样通过监听连接等方式来登陆时非常慢(LINUX/HP-UX也存在此问题),甚至要5分钟、10分钟左右才能进入。这种问题在排除系统资源如CPU/IO/内存、网络等资源紧张外;经常是因为hostname与/etc/resolve....

android UI效果四: 动态填充Bitmap像素信息_laohuang1122的博客-程序员宅基地

要想修改Bitmap图片的 R G B信息 首先 得先拿到这张图片每个点的Color值 然后根据这个Color值 就可以算出对应的R G B 值 我们都知道在计算机语言中在内存中加载一张图片实际上是把图片的每个点的RGB信息写入内存 如果动态的修改了这些颜色信息 那绘制出来的图片就会改变。            修改图片的颜色值其实在很多地方都有用处,我记得以前我做J2ME游戏开发的时候

推荐文章

热门文章

相关标签