RocketMQ—RocketMQ消费重试和死信消息

RocketMQ---RocketMQ消费重试和死信消息

消费重试

生产者重试

设置重试的代码如下

java 复制代码
// 失败的情况重发3次
producer.setRetryTimesWhenSendFailed(3);
// 消息在1S内没有发送成功,就会重试
producer.send(msg, 1000);

一般情况下,我们不会在生产者方进行重试。

消费者重试

消费者在消费消息的过程中,下方三种情况会进行重试:

  • 业务报错了
  • 返回null 返回
  • 返回RECONSUME_LATER

代码如下:

java 复制代码
/**
     * 重试的时间间隔
     * 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
     * 默认重试16次
     * --------------
     * 重试的次数一般 5次
     * @throws Exception
     */
@Test
public void retryConsumer() throws Exception {
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("retry-consumer-group");
    consumer.setNamesrvAddr(MqConstant.NAME_SERVER_ADDR);
    consumer.subscribe("retryTopic", "*");
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            MessageExt messageExt = msgs.get(0);
            System.out.println(new Date());
            System.out.println(messageExt.getReconsumeTimes());
            System.out.println(new String(messageExt.getBody()));
            // 业务报错了 返回null 返回 RECONSUME_LATER 都会重试
            return ConsumeConcurrentlyStatus.RECONSUME_LATER;
        }
    });
    consumer.start();
    System.in.read();
}

消息默认重试16次:

能否自定义重试次数

设置重试次数的代码如下:

java 复制代码
// 设定重试次数
consumer.setMaxReconsumeTimes(2);

消息的构成如下:

如果使用了上述代码,就会为消息头设置重试次数。

死信消息

如果消息重试了最大次数还是失败怎么办

最大次数:如果没有设置最大次数,默认情况下,并发模式是16次,顺序模式是int的最大值。

如果重试了最大次数还是失败,就会变成死信消息,会被放进一个死信主题中去,这个死信主题的名字是有规律的,这个主题是

%DLQ%消费者组的名称

当消息处理失败的时候该如何正确的处理

  1. 可以监听死信消息,给管理员发送邮件或者短信通知,但是如果有多个死信消息,就要写多个监听器;
  2. 可以手动判断重试次数,如果大于某个次数,就记录下来,就不重试了,发送邮件或者短信通知。
java 复制代码
try {
    handleDb();
} catch (Exception e) {
    // 重试
    int reconsumeTimes = messageExt.getReconsumeTimes();
    if (reconsumeTimes >= MAX_TIMES) {
        // 不要重试了
        System.out.println("记录到特别的位置 文件 mysql 通知人工处理");
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
相关推荐
摇滚侠1 天前
《RocketMQ 官网》阅读笔记 RocketMQ 订阅 (Subscription)
笔记·rocketmq
摇滚侠1 天前
《RocketMQ 官网》阅读笔记 RocketMQ 消费者组(Consumer Group)消费者(Consumer)
笔记·rocketmq
摇滚侠2 天前
《RocketMQ 官网》阅读笔记 RocketMQ 消息队列 MessageQueue 消息 Messagege
笔记·rocketmq
Bug收容所2 天前
12305项目学习day5
java·spring boot·redis·mysql·spring·rocketmq
啊啊啊迈 旋棍3 天前
生态整合与实战篇:Spring Boot 整合 RocketMQ 完全指南
spring boot·rocketmq·java-rocketmq
坚持的小马4 天前
Rocketmq搭建操作步骤
java·rocketmq·java-rocketmq
Ai拆代码的曹操4 天前
RocketMQ 消息堆积排查实战:从 20 个消费者线程卡死到 rebalance 死亡螺旋
后端·rocketmq
码农学院4 天前
Spring Boot RocketMQ构建电商零售高并发订单处理系统
spring boot·rocketmq·java-rocketmq
阿里云云原生6 天前
会话即 Topic:RocketMQ LiteTopic 如何支撑 AI Agent 实现分钟级异步协作与精细化限流?
rocketmq