经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » RocketMQ » 查看文章
RocketMQ—RocketMQ消费重试和死信消息
来源:cnblogs  作者:随机的未知  时间:2024/2/18 9:01:07  对本文有异议

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

消费重试

生产者重试

设置重试的代码如下

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

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

消费者重试

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

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

代码如下:

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

消息默认重试16次:

能否自定义重试次数

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

  1. // 设定重试次数
  2. consumer.setMaxReconsumeTimes(2);

消息的构成如下:

消息构成

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

死信消息

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

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

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

%DLQ%消费者组的名称

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

  1. 可以监听死信消息,给管理员发送邮件或者短信通知,但是如果有多个死信消息,就要写多个监听器;
  2. 可以手动判断重试次数,如果大于某个次数,就记录下来,就不重试了,发送邮件或者短信通知。
  1. try {
  2. handleDb();
  3. } catch (Exception e) {
  4. // 重试
  5. int reconsumeTimes = messageExt.getReconsumeTimes();
  6. if (reconsumeTimes >= MAX_TIMES) {
  7. // 不要重试了
  8. System.out.println("记录到特别的位置 文件 mysql 通知人工处理");
  9. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  10. }
  11. return ConsumeConcurrentlyStatus.RECONSUME_LATER;
  12. }

原文链接:https://www.cnblogs.com/nicaicai/p/18018420

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号