RabbitMQ 消费者消费消息失败,会一直重复发送

时间:2025-04-13 18:38:34

    • 背景
    • 解决
      • yml配置
      • 生产者
      • 消费者

背景

最近在开发一个公众号的项目,现在有一个需求是需要向多个用户发送消息模板,但是由于用户比较多,发送的比较慢。所以采取的措施是,当后台一键提醒之后,先将需要提醒的用户和信息加入消息队列,不请求发送模板消息接口,当加入消息队列成功之后,就返回成功。然后再监听消息队列,当队列中有消息时,自动取出消息,调用发送接口消费,给用户发送模板消息。

但是当消费失败的时候,消息队列会一直重复的发送消息,导致程序死循环。

解决

yml配置

配置RabbitMQ,消费消息失败之后,重试三次,将消息干掉

  # rabbitmq
  rabbitmq:
    host: ****
    username: ****
    password: ****
    virtual-host: ****

    listener:
      simple:
        #决定被拒绝的消息是否重新入队
        default-requeue-rejected: true
        retry:
          #时间间隔5秒
          initial-interval: 5000ms
          enabled: true
          #最大重试次数
          max-attempts: 3

生产者

private final AmqpTemplate amqpTemplate;
public void sendTemplateToMany() {
	String res = "测试发送消息";
	this.amqpTemplate.convertAndSend("","", res);
}

消费者

@Component
@Slf4j
public class ListenerQueue {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "", durable = "true"),
            exchange = @Exchange(
                    value = "",
                    ignoreDeclarationExceptions = "true",
                    type = ExchangeTypes.TOPIC
            ),
            key = {"#.#"}))
    public void listen(String res) {
        log.info("消费者开始消费,调取微信接口向用户发送模板消息");
        System.out.println(res); // 测试发送消息
		...
    }
}

参考文章:RabbitMQ死信队列(消费失败的消息重复发送-死循环)