栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringAMQP对RabbitMQ消息的确认

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringAMQP对RabbitMQ消息的确认

SpringAMQP对RabbitMQ消息的确认
  • 发送者确认
  • 发送者回执

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

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

发送者确认

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

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

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


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

 
    @Test
    public void testConfirm()
    {
        //定义回调
        template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            
            @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","你好,我的小宝贝");

    }


这里的参数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");
    }

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

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


这样也接收到了,我们验证一下失败的情况。
这样的返回发生在交换机到队列的传输,所以我们设置一个不存在的队列。
随便来一个错误的。

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


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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1028483.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号