iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么用SpringBoot+RabbitMQ实现消息可靠传输
  • 252
分享到

怎么用SpringBoot+RabbitMQ实现消息可靠传输

2023-06-30 15:06:26 252人浏览 泡泡鱼
摘要

这篇文章主要介绍了怎么用SpringBoot+RabbitMQ实现消息可靠传输的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用springBoot+RabbitMQ实现消息可靠传输文章都会有所收获,下面我们

这篇文章主要介绍了怎么用SpringBoot+RabbitMQ实现消息可靠传输的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用springBoot+RabbitMQ实现消息可靠传输文章都会有所收获,下面我们一起来看看吧。

    环境配置

    SpringBoot 整合 RabbitMQ 实现消息的发送。

    添加 Maven 依赖

           <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-amqp</artifactId>        </dependency>

    添加 application.yml 配置文件

    spring:  rabbitmq:    host: 192.168.3.19    port: 5672    username: admin    passWord: xxxx

    配置交换机、队列以及绑定

        @Bean    public DirectExchange myExchange() {        DirectExchange directExchange = new DirectExchange("myExchange");        return directExchange;    }    @Bean    public Queue myQueue() {        Queue queue = new Queue("myQueue");        return queue;    }    @Bean    public Binding binding() {        return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey");    }

    生产发送消息

        @Autowired    private RabbitTemplate rabbitTemplate;    @GetMapping("/send")    public String send(String message) {        rabbitTemplate.convertAndSend("myExchange","myRoutingKey",message);        System.out.println("【发送消息】" + message)        return "【send message】" + message;    }

    消费者接收消息

        @RabbitListener(queuesToDeclare = @Queue("myQueue"))    public void process(String msg, Channel channel, Message message) {        SimpleDateFORMat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        Date date = new Date();        String time = sdf.format(date);        System.out.println("【接收信息】" + msg + " 当前时间" + time);

    调用生产端发送消息 hello,控制台输出:

    【发送消息】hello
    【接收信息】hello 当前时间2022-05-12 10:21:14

    说明消息已经被成功接收。

    消息丢失分析

    怎么用SpringBoot+RabbitMQ实现消息可靠传输

    一条消息的从生产到消费,消息丢失可能发生在以下几个阶段:

    • 生产端丢失: 生产者无法传输到 RabbitMQ

    • 存储端丢失: RabbitMQ 存储自身挂了

    • 消费端丢失:存储由于网络问题,无法发送到消费端,或者消费挂了,无法发送正常消费

    RabbitMQ 从生产端、储存端、消费端都对可靠性传输做很好的支持。

    生产阶段

    生产阶段通过请求确认机制,来确保消息的可靠传输。当发送消息到 RabbitMQ 服务器 之后,RabbitMQ 收到消息之后,给发送返回一个请求确认,表示RabbitMQ 服务器已成功的接收到了消息。

    配置application.yml

    spring:  rabbitmq:    # 消息确认机制 生产者 -> 交换机    publisher-confirms: true    # 消息返回机制  交换机 -> 队列    publisher-returns: true

    配置

    @Configuration@Slf4jpublic class RabbitConfig {    @Autowired    private ConnectionFactory connectionFactory;    @Bean    public RabbitTemplate rabbitTemplate() {        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {            @Override            public void confirm(CorrelationData correlationData, boolean ack, String cause) {                log.info("【correlationData】:" + correlationData);                log.info("【ack】" + ack);                log.info("【cause】" + cause);                if (ack) {                    log.info("【发送成功】");                } else {                    log.info("【发送失败】correlationData:" + correlationData + " cause:" + cause);                }            }        });        rabbitTemplate.setMandatory(true);        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {            @Override            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {                log.warn("【消息发送失败】");                log.info("【message】" + message);                log.info("【replyCode】" + replyCode);            }        });        return rabbitTemplate;    }}

    消息从 生产者 到 交换机, 有confirmCallback 确认模式。发送消息成功后消息会调用方法confirm(CorrelationData correlationData, boolean ack, String cause),根据 ack 判断消息是否发送成功。

    消息从 交换机 到 队列,有returnCallback 退回模式。

    发送消息 product message 控制台输出如下:

    【发送消息】product message
    【接收信息】product message 当前时间2022-05-12 11:27:56
    【correlationData】:null
    【ack】true
    【cause】null
    【发送成功】

    生产端模拟消息丢失

    这里有两个方案:

    • 发送消息后立马关闭 broke,后者把网络关闭,但是broker关闭之后控制台一直就会报错,发送消息也报500错误。

    • 发送不存在的交换机:

    // myExchange 修改成 myExchangexxxxxrabbitTemplate.convertAndSend("myExchangexxxxx","myRoutingKey",message);

    结果:

    【correlationData】:null
    【ack】false
    【cause】channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'myExchangexxxxx' in vhost '/', class-id=60, method-id=40)
    【发送失败】

    当发送失败可以对消息进行重试

    交换机正确,发送不存在的队列:

    交换机接收到消息,返回成功通知,控制台输出:

    【correlationData】:CorrelationData [id=7d468b47-b422-4523-b2a2-06b14aef073c]
    【ack】true
    【cause】null
    【发送成功】

    交换机没有找到队列,返回失败信息:

    【消息发送失败】
    【message】product message
    【replyCode】312

    RabbitMQ

    开启队列持久化,创建的队列和交换机默认配置是持久化的。首先把队列和交换机设置正确,修改消费监听的队列,使得消息存放在队列里

    修改队列的持久化,修改成非持久化:

        @Bean    public Queue myQueue() {        Queue queue = new Queue("myQueue",false);        return queue;    }

    发送消息之后,消息存放在队列中,然后重启 RabbitMQ,消息不存在了。
    设置队列持久化:

        @Bean    public Queue myQueue() {        Queue queue = new Queue("myQueue",true);        return queue;    }

    重启之后,队列的消息还存在。

    消费端

    消费端默认开始 ack 自动确认模式,当队列消息被消费者接收,不管有没有被消费端消息,都自动删除队列中的消息。所以为了确保消费端能成功消费消息,将自动模式改成手动确认模式:

    修改application.yml 文件

    spring:  rabbitmq:    # 手动消息确认    listener:      simple:        acknowledge-mode: manual

    消费接收消息之后需要手动确认:

    channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        @RabbitListener(queuesToDeclare = @Queue("myQueue"))    public void process(String msg, Channel channel, Message message) {        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        Date date = new Date();        String time = sdf.format(date);        System.out.println("【接收信息】" + msg + " 当前时间" + time);        System.out.println(message.getMessageProperties().getDeliveryTag());        try {            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);        } catch (IOException e) {            e.printStackTrace();        }    }

    如果不添加:

    channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);

    发送两条消息

    消息被接收后,没有确认,重新放到队列中:

    怎么用SpringBoot+RabbitMQ实现消息可靠传输

    重启项目,之后,队列的消息会发送到消费者,但是没有 ack 确认,还是继续会放回队列中。

    加上 channel.basicAck 之后,再重启项目

    怎么用SpringBoot+RabbitMQ实现消息可靠传输

    队列消息就被删除了

    basicAck 方法最后一个参数 multiple 表示是删除之前的队列。

    multiple 设置成 true,把后面的队列都清理掉了

    怎么用SpringBoot+RabbitMQ实现消息可靠传输

    关于“怎么用SpringBoot+RabbitMQ实现消息可靠传输”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用SpringBoot+RabbitMQ实现消息可靠传输”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: 怎么用SpringBoot+RabbitMQ实现消息可靠传输

    本文链接: https://www.lsjlt.com/news/330110.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 怎么用SpringBoot+RabbitMQ实现消息可靠传输
      这篇文章主要介绍了怎么用SpringBoot+RabbitMQ实现消息可靠传输的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用SpringBoot+RabbitMQ实现消息可靠传输文章都会有所收获,下面我们...
      99+
      2023-06-30
    • SpringBoot+RabbitMQ实现消息可靠传输详解
      目录环境配置消息丢失分析生产阶段生产端模拟消息丢失RabbitMQ消费端环境配置 SpringBoot 整合 RabbitMQ 实现消息的发送。 1.添...
      99+
      2024-04-02
    • RabbitMQ和Kafka怎么保证消息队列的可靠性传输
      本篇内容主要讲解“RabbitMQ和Kafka怎么保证消息队列的可靠性传输”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“RabbitMQ和Kafka怎么保证消息队列的可靠性传输”吧!面试题如何保...
      99+
      2023-06-02
    • springboot中rabbitmq实现消息可靠性机制详解
      1. 生产者模块通过publisher confirm机制实现消息可靠性  1.1 生产者模块导入rabbitmq相关依赖 <!--AMQP依赖,包含Rabbit...
      99+
      2024-04-02
    • Golang RabbitMQ: 实现可靠消息传递的设计与实现
      在Golang中,可以使用RabbitMQ来实现可靠消息传递。RabbitMQ是一个开源的消息中间件,它实现了AMQP(Advanc...
      99+
      2023-10-20
      Golang
    • Golang RabbitMQ: 实现高可靠性消息传递的最好实践
      下面是 Golang RabbitMQ 中实现高可靠性消息传递的最佳实践:1. 使用持久化队列和消息:RabbitMQ 默认情况下消...
      99+
      2023-10-08
      Golang
    • C#利用RabbitMQ实现点对点消息传输
      目录消息队列模型RabbitMQ设置RabbitMQ动态库安装RabbitMQ.Client相关知识点示例效果图核心代码消息队列模型 所有 MQ 产品从模型抽象上来说都是一样的过程...
      99+
      2024-04-02
    • C#如何利用RabbitMQ实现点对点消息传输
      这篇文章主要介绍C#如何利用RabbitMQ实现点对点消息传输,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!消息队列模型所有 MQ 产品从模型抽象上来说都是一样的过程:消费者(consumer)订阅某个队列。生产者(...
      99+
      2023-06-15
    • Java ActiveMQ:助力企业实现可靠、高效的消息传输
      ActiveMQ 是一个完全开源的 Java 消息服务器,也是 Apache 软件基金会旗下最受欢迎的项目之一。它遵循 Java 消息服务 (JMS) 规范,提供了一套用于构建分布式、异步和面向消息的应用程序的 API。ActiveMQ...
      99+
      2024-02-08
      ActiveMQ JMS 消息传输 消息队列 可靠性 高效性
    • RabbitMQ中怎么保证消息的可靠投递
      今天就跟大家聊聊有关RabbitMQ中怎么保证消息的可靠投递,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。RabbitMQ整合Spring Boot...
      99+
      2024-04-02
    • Golang RabbitMQ: 实现可靠消息传递和系统监控的架构设计
      在Golang中,可以使用RabbitMQ来实现可靠的消息传递和系统监控的架构设计。首先,我们需要在Golang中使用RabbitM...
      99+
      2023-10-20
      Golang
    • Storm如何实现可靠性消息传递
      Storm具有内置的可靠性机制,可以确保消息传递的可靠性。它使用“ack”和“fail”机制来跟踪每个消息的处理状态,并在消息处理失...
      99+
      2024-04-02
    • Golang RabbitMQ: 实现可靠消息传递、系统监控和告警的架构设计与实现
      架构设计和实现可靠消息传递、系统监控和告警的过程可以分为以下几个步骤:1. RabbitMQ基础架构设计:- 安装和配置Rabbit...
      99+
      2023-10-08
      Golang
    • 怎么进行TCP可靠传输的实现
      本篇文章为大家展示了怎么进行TCP可靠传输的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一.以字节为单位的滑动窗口在TCP里,接收端(B)会给发送端(A)报一个窗口的大小,叫Advertise...
      99+
      2023-06-03
    • Golang中使用RabbitMQ实现消息确认和保证可靠性的技巧
      在Golang中使用RabbitMQ实现消息确认和保证可靠性的技巧包括以下几个方面:1. 使用消息确认机制:在RabbitMQ中,可...
      99+
      2023-10-20
      Golang
    • SpringBoot整合RabbitMQ实现消息确认机制
      前面几篇案例已经将常用的交换器(DirectExchange、TopicExchange、FanoutExchange)的用法介绍完了,现在我们来看一下消息的回调,也就是消息确认。 ...
      99+
      2024-04-02
    • PHP怎么实现RabbitMQ消息列队
      这篇“PHP怎么实现RabbitMQ消息列队”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP怎么实现RabbitMQ消息...
      99+
      2023-06-30
    • Golang中使用RabbitMQ实现消息确认和保证可靠性的最佳实践
      在Golang中使用RabbitMQ实现消息确认和保证可靠性的最佳实践包括以下步骤:1. 引入依赖包:使用`go get`命令安装R...
      99+
      2023-10-08
      Golang
    • WCF和Remoting之间怎么实现消息传输
      这篇文章主要讲解了“WCF和Remoting之间怎么实现消息传输”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF和Remoting之间怎么实现消息传输”吧!一.NET Remoting ...
      99+
      2023-06-30
    • 怎么使用springboot + rabbitmq消息确认机制
      这篇文章主要介绍“怎么使用springboot + rabbitmq消息确认机制”,在日常操作中,相信很多人在怎么使用springboot + rabbitmq消息确认机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
      99+
      2023-06-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作