前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringAMQP对RabbitMQ消息的确认

SpringAMQP对RabbitMQ消息的确认

作者头像
兰舟千帆
发布2022-08-03 18:23:21
3500
发布2022-08-03 18:23:21
举报

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() 路由键

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

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

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

随便来一个错误的。

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringAMQP对RabbitMQ消息的确认
  • 发送者确认
  • 发送者回执
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档