RabbitMq基础篇-10-消费重试次数实现玩法

1. 需求

在rabbitmq消息确认设置为手动提交的时候,消息怎么在重试一定次数的情况下才放入死信队列。

1.1. 配置

  • rabbitmq的配置:消费端手动应答
spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: manual # 消费方手动应答
      direct:
        retry:
          enabled: true    # 开启消费重试机制
          max-attempts: 3  # 最大重试机制,默认为3
          initial-interval: 1000  # 重试间隔,单位毫秒,默认1000

1.2 . 代码

手动确认提交,当不确认消息,设置重新放回队列的时候

channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);

1.3 问题:

在手动确认的条件下,使用如上配置消息在重试三次之后,就会放入死信队列,事实上手动提交的时候,basicNack的最后一个参数requeue = true时,消息会被无限次的放入消费队列重新消费,直至回送ACK。但是当requeue = false 的时候,此时消息就会立马进入到死信队列。

那么手动提交怎么去设置消息消费失败后回到队列的思路呢?

2. 结合redis解决

使用redis 存储消息的重试次数,redis 的key 就是消息的Id, value为消息的重试次数,代码如下:

         //消费失败重试3次,3次失败后放入死信队列
            msgId = (String) message.getMessageProperties().getHeaders().get("spring_returned_message_correlation");
            int retryCount = (int) redisUtil.get(msgId);
            System.out.println("------ retryCount : " + retryCount);
            if (retryCount >= MAX_RECONSUME_COUNT) {
                //requeue = false 放入死信队列
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
            } else {
                //requeue = true 放入消费队列重试消费
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
                redisUtil.set(msgId, retryCount + 1);
            }
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alan0517

感谢您的鼓励与支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值