SpringAMQP对RabbitMQ消息的确认

2022-08-03 18:23:21 浏览数 (1)

SpringAMQP对RabbitMQ消息的确认

  • 发送者确认
  • 发送者回执

此文的案例基础在上文基础上改造。上文SpringBoot整合RabbitMQ

本篇主要实现一个对生产者发送消息的确认。也就是当我们的生产者发送消息后,消费者这里是否有正确的接收等等,以及对于消息的反馈。

简单的说就是一个对消息的处理方案。

下面我们介绍两个方案。

发送者确认

发送者确认就是publisher-confirm,这个方案主要在交换机这里进行处理。

具体的处理逻辑呢,直接就开始用代码去演示好了。

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

代码语言:javascript复制
 publisher-confirm-type: correlated #开启确认模式

然后我们在测试类里面这样去写,写这样的一个测试方法

代码语言:javascript复制
 /**
     * 在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","你好,我的小宝贝");

    }

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

你看接收到了。

发送者回执

回执的方法怎么写呢?

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

来看具体的方法

代码语言:javascript复制
@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");
    }

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

如果正常执行后,是不会输出信息的。

这样也接收到了,我们验证一下失败的情况。

这样的返回发生在交换机到队列的传输,所以我们设置一个不存在的队列。

随便来一个错误的。

但是你这样做的话,其实还是可以找到,因为我们之前做了配置中,队列会自动创建。那么我们就不要让它自动创建。

把这里注释到,但是交换机的创建我们不需注释。

执行!这样这个方法就执行了。其实我们是找交换机找不到队列,所以方法被回调了。

0 人点赞