zoukankan      html  css  js  c++  java
  • rabbitmq学习之路(四)

    今天就说一下 如何防止消息丢失    防止消息丢失 分为 消息发送确认和消息消费确认,今天先说消息发送确认

    经过我的了解,消息发送确认分为两个步骤,消息到达交换机和消息到达队列,这是两个分开的步骤

    直接上代码来介绍,要开启消息发送确认需要在配置上增加这两项

    #开启生产者消息确认机制
    spring.rabbitmq.publisher-confirms=true
    spring.rabbitmq.publisher-returns=true

    我们需要知道两个接口,

    RabbitTemplate.ConfirmCallback 
    RabbitTemplate.ReturnCallback


    第一个接口,对应着消息到达交换机这一步,第二个接口,对应着消息到达队列这一步

    @Service
    public class ConfirmCallBackListener implements RabbitTemplate.ConfirmCallback {
    
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @PostConstruct
        public void init(){
            rabbitTemplate.setConfirmCallback(this);
        }
    
    
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            System.out.println("消息唯一标识:"+correlationData);
            System.out.println("确认结果:"+ack);
            System.out.println("失败原因:"+cause);
        }
    }
    @Service
    public class ReturnCallBackListener implements RabbitTemplate.ReturnCallback{
    
    
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @PostConstruct
        public void init(){
            rabbitTemplate.setReturnCallback(this);
        }
    
        @Override
        public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
            System.out.println("return--message:" + new String(message.getBody()) + ",replyCode:" + replyCode + ",replyText:" + replyText + ",exchange:" + exchange + ",routingKey:" + routingKey);
        }
    }

    就是这么简单,配置完成之后,一旦消息成功到达交换机,confirmCallBack 收到的ack就是true,如果没有到达交换机,收到的ack就是false

    如果消息到达了队列,那么returnCallBack不会收到任何消息,如果消息到达不了队列(路由不到队列等),就会触发回调

    我在查资料的时候发现,有一篇文章说需设置mandatory=true,否则不会触发returncallback的回调,不太清楚,需要继续查资料

  • 相关阅读:
    JVM的学习5_____垃圾回收:分代收集算法
    JVM的学习4____GC的作用和垃圾的标记
    JVM的学习3_____逃逸分析与栈上分配
    JVM的学习2____对象实例的内存分配原理
    JVM的学习1_____内存模型
    SpringMVC的学习____6.JSON 和Ajax
    两种方法关联控制器和DOM
    img的src,a的href使用{{}}设置属性不能生效
    ng之{{value}}顺序
    ng之ng-app指令
  • 原文地址:https://www.cnblogs.com/changeCode/p/11299471.html
Copyright © 2011-2022 走看看