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

背景

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

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

解决

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("mq.exchange","a.b", res);
}

消费者

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

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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
RabbitMQ 是一个功能强大的消息队列中间件,但消息重复消费是一个常见的问题。有几种常见的原因可能导致消息重复消费: 1. 网络问题或连接中断:当消费者RabbitMQ 接收到消息后,如果网络出现问题或连接中断,可能导致消费者无法发送确认消息RabbitMQ,从而导致 RabbitMQ 认为该消息没有被正确消费,然后重新将该消息发送给其他消费者。 2. 消费者应用程序异常终止:如果消费者应用程序在处理消息的过程中崩溃或异常终止,RabbitMQ 将重新将该消息发送给其他消费者。 3. 消息处理失败未确认:如果消费者应用程序在处理消息时发生错误,并且没有发送确认消息告知 RabbitMQ 消息处理失败RabbitMQ 将重新将该消息发送给其他消费者。 为了解决消息重复消费的问题,可以考虑以下几点: 1. 使用消息的唯一标识符:在消息的属性中添加唯一标识符,并在消费者端对已经处理过的消息进行记录。这样,在接收到新消息时,可以先检查该消息是否已经被处理过,避免重复处理。 2. 设置消息的过期时间:可以为每条消息设置一个过期时间,在一定时间内未被消费者处理,则认为该消息已过期,不再重新发送给其他消费者。 3. 使用幂等性操作:在消费者处理消息的过程中,尽量使用幂等性操作,即使同样的消息被多次处理,也不对系统状态造成影响。 4. 异常处理和消息确认:在消费者应用程序中,及时捕捉并处理异常情况,并在消息处理完成后发送确认消息RabbitMQ,确保消息被正确消费。 这些是一些常见的解决方案,根据实际情况选择适合的方法来避免消息重复消费
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值