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通过方向键控制小球移动的小游戏

    这篇文章主要为大家详细介绍了java通过方向键控制小球移动的小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 利用Java实现图片马赛克效果

    利用Java实现图片马赛克效果

    马赛克效果是一种常见的图像处理技术,通过将图像划分为多个小块并对每个小块进行平均色处理,模拟马赛克的效果,在本项目中,我们将使用Java的Swing库和图像处理技术来实现图片的马赛克特效,需要的朋友可以参考下
    2025-02-02
  • Java稀疏数组详细图文教程

    Java稀疏数组详细图文教程

    当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组看做是普通数组的压缩,这篇文章主要给大家介绍了关于Java稀疏数组的相关资料,需要的朋友可以参考下
    2023-09-09
  • Java实战之邮件的撰写和发送

    Java实战之邮件的撰写和发送

    这篇文章主要为大家详细介绍了通过Java代码实现邮件的撰写和发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,需要的小伙伴们可以学习一下
    2021-11-11
  • Java如何在临界区中避免竞态条件

    Java如何在临界区中避免竞态条件

    这篇文章主要介绍了Java如何在临界区中避免竞态条件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java杂谈之如何优化写出漂亮高效的代码

    Java杂谈之如何优化写出漂亮高效的代码

    不一致的代码会造成认知上的负担,在一个系统中,做类似的事情,却有不同的做法,或者起到类似作用的事物,却有不同的名字,让人困惑
    2021-09-09
  • Spring boot事务无效报错:Transaction not enabled问题排查解决

    Spring boot事务无效报错:Transaction not enabled问题排查解决

    在业务代码中经常需要保证事务的原子性,但是有的时候确实是出现事务没有生效,这篇文章主要给大家介绍了关于Spring boot事务无效报错:Transaction not enabled问题排查的相关资料,需要的朋友可以参考下
    2023-11-11
  • SpringBoot中的@ControllerAdvice注解原理详解

    SpringBoot中的@ControllerAdvice注解原理详解

    这篇文章主要介绍了SpringBoot中的@ControllerAdvice注解原理详解,在SpringBoot应用程序启动过程中,Spring会扫描所有的类,寻找带有@ControllerAdvice注解的类这些方法会被添加到一个映射表中,以便后续处理异常时能找到对应的处理方法,需要的朋友可以参考下
    2024-01-01
  • Springboot+Mybatis中typeAliasesPackage正则扫描实现方式

    Springboot+Mybatis中typeAliasesPackage正则扫描实现方式

    这篇文章主要介绍了Springboot+Mybatis中typeAliasesPackage正则扫描实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java开发环境配置教程(win7 64bit)

    Java开发环境配置教程(win7 64bit)

    这篇文章主要为大家详细介绍了win7 64bit下Java开发环境的配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论