• SpringAMQP对RabbitMQ消息的确认


    SpringAMQP对RabbitMQ消息的确认

    此文的案例基础在上文基础上改造。上文SpringBoot整合RabbitMQ
    本篇主要实现一个对生产者发送消息的确认。也就是当我们的生产者发送消息后,消费者这里是否有正确的接收等等,以及对于消息的反馈。

    简单的说就是一个对消息的处理方案。
    下面我们介绍两个方案。

    发送者确认

    发送者确认就是publisher-confirm,这个方案主要在交换机这里进行处理。
    具体的处理逻辑呢,直接就开始用代码去演示好了。

    首先我们需要开启这个发送者确认,我们需要在yml文件中配置

     publisher-confirm-type: correlated #开启确认模式
    
    • 1

    在这里插入图片描述
    然后我们在测试类里面这样去写,写这样的一个测试方法

     /**
         * 在yml配置文件当中开启去人模式
         * 在RabbitTemplate定义ConfirmCallBack回调函数
         */
        @Test
        public void testConfirm()
        {
            //定义回调
            template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
                /**
                 *
                 * @param correlationData convertAndSend相关的配置信息,该方法有重载。所以会有一些不同参数
                 * @param b 代表交换机是否成功收到了消息,true代表成功,false代表失败
                 * @param s 代表失败的原因
                 */
                @Override
                public void confirm(CorrelationData correlationData, boolean b, String s) {
                    System.out.println(b);
    
                    System.out.println("confirm 方法被执行了");
                    if(!b)
                    {
                        //接收成功
                        System.out.println("消息成功接收");
    
                    }else {
                        System.out.println("消息接受失败,"+s);
    
                    }
                }
            });
            //发送一条消息
            template.convertAndSend(RabbitConfig.Exchange_Name,"boot.haha","你好,我的小宝贝");
    
        }
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35

    /**
    *
    * @param correlationData convertAndSend相关的配置信息,该方法有重载。所以会有一些不同参数
    * @param b 代表交换机是否成功收到了消息,true代表成功,false代表失败
    * @param s 代表失败的原因
    */
    这里的参数b,这里老师讲的是当成功的时候会返回true,但是我这里发送失败会返回true,发送成功会返回false,已经验证过了。s参数是错误信息。
    这里的成功与失败是相对于交换机的需要注意
    在这里插入图片描述

    在这里插入图片描述
    你看接收到了。

    在这里插入图片描述

    在这里插入图片描述

    发送者回执

    回执的方法怎么写呢?

    这个回执是相对于队列的。当消息发送给Exchange后,Exchange路由到Queue失败后才会执行ReturnCallBack。

    来看具体的方法

    @Test
    public void testReturn()
        {
    //        设置交换机处理消息的模式
            template.setMandatory(true);//设置为true交换机会将路由到队列失败的消息再返回给发送者
            template.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
                @Override
                public void returnedMessage(ReturnedMessage returnedMessage) {
                    System.out.println("消息对象:"+returnedMessage.getMessage());
                    System.out.println("错误码:"+returnedMessage.getReplyCode());
                    System.out.println("错误信息:"+returnedMessage.getReplyText());
                    System.out.println("交换机:"+returnedMessage.getExchange());
                    System.out.println("路由键:"+returnedMessage.getRoutingKey());
    
    
                    System.out.println("return执行了...");
                }
            });
            template.convertAndSend(RabbitConfig.Exchange_Name,"boot.haha","hi");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    // returnedMessage.getMessage() 消息对象
    // returnedMessage.getReplyCode() 错误码
    // returnedMessage.getReplyText() 错误信息
    // returnedMessage.getExchange() 交换机
    // returnedMessage.getRoutingKey() 路由键

    如果正常执行后,是不会输出信息的。
    在这里插入图片描述

    在这里插入图片描述
    这样也接收到了,我们验证一下失败的情况。
    这样的返回发生在交换机到队列的传输,所以我们设置一个不存在的队列。
    随便来一个错误的。
    在这里插入图片描述
    但是你这样做的话,其实还是可以找到,因为我们之前做了配置中,队列会自动创建。那么我们就不要让它自动创建。
    把这里注释到,但是交换机的创建我们不需注释。

    在这里插入图片描述
    执行!这样这个方法就执行了。其实我们是找交换机找不到队列,所以方法被回调了。

    在这里插入图片描述

  • 相关阅读:
    RHCE学习 --- 第四次作业
    计算机网络
    软件测试/测试开发丨性能测试体系学习笔记
    会议OA之会议排座&送审
    05-5.4.2 树、森林和二叉树的转换
    java计算机毕业设计vue架构云餐厅美食订餐系统MyBatis+系统+LW文档+源码+调试部署
    Python对象复制竟然有这么多种方式,赶紧学起来!
    数据库索引的基本操作(sql语句)
    编写第一个python程序
    一步步带你用react+spring boot搭建后台之二(登录与首页篇)
  • 原文地址:https://blog.csdn.net/jgdabc/article/details/126003749