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

rabbitmq的配置:消费端手动应答
在这里插入图片描述
在手动确认的条件下这些参数不太好使
在这里插入图片描述

在这里插入图片描述

原以为使用如上配置消息在重试三次之后,就会放入死信队列,事实上手动提交的时候,basicNack的最后一个参数requeue = true时,消息会被无限次的放入消费队列重新消费,直至回送ACK。

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

但是当requeue = false 的时候,此时消息就会立马进入到死信队列

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

那么手动提交怎么去设置消息消费失败后回到队列的思路呢?
RabbitMQ实现重试次数方法一-SpringRetry
RabitMQ实现重试次数二-放入消息体

结合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);}

结果:
在这里插入图片描述

别找我打球了
原创文章 45获赞 11访问量 5211
关注私信
展开阅读全文