RabbitMQ实现消息可靠性传递过程讲解

 更新时间:2023年05月20日 09:05:36   作者:小白的救赎  
消息的可靠性传递是指保证消息百分百发送到消息队列中去,这篇文章主要介绍了RabbitMQ实现消息可靠性传递过程,感兴趣想要详细了解可以参考下文

目录结构

导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.5.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

修改yml

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    publisher-confirm-type: correlated # 开启确认回调
    publisher-returns: true # 开启退回回调

在publisher-confirm-type中有三个确认消息接受类型:none、correlated、simple。

publisher-confirm-type: none 表示禁用发布确认模式。是默认值。使用此模式之后,不管消息有没有发送到Broker(RabbitMQ)都不会触发ConfirmCallback回调。

publisher-confirm-type: correlated 表示消息成功到达Broker后触发ConfirmCalllBack回调。

publisher-confirm-type: simple 表示如果消息成功到达Broker后一样会触发ConfirmCalllBack回调,发布消息成功后使用rabbitTemplate调用waitForConfirms()或waitForConfirmsOrDie()方法等待Broker节点返回发送结果,根据返回结果来判定下一步的逻辑。如果waitForConfirmsOrDie()方法如果返回false则会关闭channel信道,则接下来无法发送消息到Broker。

业务逻辑

@SpringBootTest
@RunWith(SpringRunner.class)
class RabbitmqProducerApplicationTests {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Test
    void testProducer() {
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            //三个参数分别为:相关配置消息、交换机是否收到消息、未收到消息的原因
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                if(b) System.out.println("交换机成功接受到了消息");
                else System.out.println("消息失败原因" + s);
            }
        });
        // 设置交换机处理失败消息的模式
        // true:消息到达不了队列时 会将消息重新返回给生产者 false:消息到达不了队列直接丢弃(默认)
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            //五个参数分别为:消息对象、失败状态码、失败信息、交换机名称、路由键
            @Override
            public void returnedMessage(Message message, int i, String s, String s1, String s2) {
                System.out.println("队列接受不到交换机的消息进行了失败回调");
            }
        });
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"test.heHe","HelloWorld");
    }
}

测试结果

为了测试是否进行了确认回调方法即confirmCallBack()方法,我将上方的交换机名称故意写错

rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME + "1","test.heHe","HelloWorld");

为了测试是否进行了退回回调方法即returnCallBack()方法,我将上方的路由键名称故意写错

rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"t.heHe","HelloWorld");

总结

经上方两次测试,可以使用ConfirmCallBack与ReturnCallBack来确认消息的可靠性传递。ConfirmCallBack是确认交换机是否可以成功接收到消息,而ReturnCallBack是确认队列是否可以成功接收到交换机发来的消息。这是作为解决作为消息发送方希望杜绝任何消息丢失或者投递失败场景。 但需要注意的是在yml中必须添加两行配置。

到此这篇关于RabbitMQ实现消息可靠性传递过程讲解的文章就介绍到这了,更多相关RabbitMQ消息可靠性传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java单例模式与破坏单例模式概念原理深入讲解

    Java单例模式与破坏单例模式概念原理深入讲解

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建
    2023-02-02
  • SpringBoot整合第三方技术的详细步骤

    SpringBoot整合第三方技术的详细步骤

    这篇文章主要介绍了SpringBoot整合第三方技术,包括整合Junit、整合Mybatis、整合Mybatis-plus、整合Druid,本文通过实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • SpringBoot如何使用Scala进行开发的实现

    SpringBoot如何使用Scala进行开发的实现

    这篇文章主要介绍了SpringBoot如何使用Scala进行开发的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java使用CountDownLatch实现统计任务耗时

    Java使用CountDownLatch实现统计任务耗时

    这篇文章主要为大家详细介绍了Java如何使用CountDownLatch实现统计任务耗时的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • 详解JavaSE中抽象类与接口的定义及使用

    详解JavaSE中抽象类与接口的定义及使用

    这篇文章主要为大家详细介绍了JavaSe的抽象类和接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-07-07
  • java创建简易视频播放器

    java创建简易视频播放器

    这篇文章主要为大家详细介绍了java创建简易视频播放器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • SpringMVC @GetMapping注解路径冲突问题解决

    SpringMVC @GetMapping注解路径冲突问题解决

    MD5对密码进行加密存储是常见的一种加密方式,本文主要介绍了Java双重MD5加密实现安全登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 解决Jackson反序列化map,set等复杂类型问题

    解决Jackson反序列化map,set等复杂类型问题

    这篇文章主要介绍了解决Jackson反序列化map,set等复杂类型问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java应用cpu飙升(超过100%)故障排查步骤

    java应用cpu飙升(超过100%)故障排查步骤

    在Java并发编程计算密集型要进行大量的计算、逻辑判断等操作,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,下面这篇文章主要给大家介绍了关于java应用cpu飙升(超过100%)故障排查步骤的相关资料,需要的朋友可以参考下
    2023-06-06
  • Java RPC框架熔断降级机制原理解析

    Java RPC框架熔断降级机制原理解析

    这篇文章主要介绍了Java RPC框架熔断降级机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论