当前位置:   article > 正文

RabbitMQ常见问题解决方案_rabbitmq消息发送成功,生产者correlationdata函数没有执行

rabbitmq消息发送成功,生产者correlationdata函数没有执行

RabbitMQ常见问题解决方案

消息丢失问题

  1. 生产者丢失消息
  2. RabbitMQ弄丢消息
  3. 消费者弄丢消息

生产者丢失消息

  • 生产者消息没到交换机,相当于生产者弄丢消息
  • 交换机没有把消息路由到队列,相当于生产者弄丢消息

对于上面两种情况,我们可以使用异步的监听操作机制来预防

①成功/未成功发送到交换机可以触发一个confirm-type监听

②交换机发送到队列会有一个publisher-returns监听

在pom文件中引入依赖项后进行配置文件的编写

rabbitmq:
    publisher-returns: true
    publisher-confirm-type: correlated 
#新版本 publisher-confirms: true 已过时

  • 1
  • 2
  • 3
  • 4
  • 5

编写配置类

@Configuration
@Slf4j
public class RabbitMQConfig {
   

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void enableConfirmCallback() {
   
        //confirm 监听,当消息成功发到交换机 ack = true,没有发送到交换机 ack = false
        //correlationData 可在发送时指定消息唯一 id
        rabbitTemplate.setConfirmCallback(
            (correlationData, ack, cause) -> {
   
            if(!ack){
   
                //记录日志、发送邮件通知、落库定时任务扫描重发
            }
        });
        
        //当消息成功发送到交换机没有路由到队列触发此监听
        rabbitTemplate.setReturnsCallback(returned -> {
   
            //记录日志、发送邮件通知、落库定时任务扫描重发
        });
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

tips:

对于实际开发中,一般不这样使用,因为丢失的概率很低,成本又很高,一般都采用日志/邮件记录,手动维护

真的极其罕见的是生产者弄丢消息,那么开发往数据库补数据就行了。

RabbitMQ弄丢消息

  • RabbitMQ 宕机导致队列、队列中的消息丢失,相当于 RabbitMQ 弄丢消息

解决方法就是设置持久化消息写出磁盘,这样子可以确保RabbitMQ宕机重启后队列和消息不会丢失

持久化操作:

  • 交换机持久化
  • 队列持久化
  • 消息持久化

交换机持久化

@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(
                    value = 
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/996827
推荐阅读
相关标签
  

闽ICP备14008679号