RabbitMQ原理及SpringBoot整合RabbitMQ

1. RabbitMQ环境搭建

参考:https://blog.csdn.net/u013071014/article/details/117079578?spm=1001.2014.3001.5501

2. RabbitMQ原理

1. 相关概念

  • 生产者(Producer):发送消息的应用
  • 消费者(Consumer):接收消息的应用
  • 队列(Queue):存储消息
  • 连接管理器(ConnectionFactory):应用程序与Rabbit之间建立连接的管理器,程序代码中使用
  • 通道(Channel):连接里的虚拟通道。通过消息队列发送或者接收消息时,这个操作就是在通道里进行的
  • 交换机(Exchange):交换机负责从生产者接收消息,并根据交换类型分发到对应的消息队列里。要实现消息的接收,一个队列必须绑定一个交换机
  • 路由键(Routing Key):用于把生产者的数据分配到交换机上
  • 绑定(Binding):用于把交换机的消息绑定到队列上
  • AMQP:高级消息队列协议(Advanced Message Queuing Protocol)是RabbitMQ使用的消息协议
  • 用户(User):可以通过指定的用户名和密码来进行连接。每个用户可以分配不同的权限,例如:读、写、配置

2. 交换机类型

  • 直接(Direct):通过消息上的路由键直接对消息进行分发
  • 扇出(Fanout):会将消息发送到所有和他进行绑定的队列上
  • 主题(Topic):会将路由键和绑定上的模式进行通配符匹配
  • 消息头(Headers):使用消息头的属性进行消息路由

3. 消息持久化

RabbitMQ在默认情况下重启服务器会导致消息丢失。

RabbitMQ持久化需满足一下条件:

  • Exchange设置持久化

  • Queue设置持久化。durable设置为true。channel.queueDeclare(XXX, true, false, false null),第二个参数设置为true

  • Message持久化发送。deliveryMode设置为2。channel.basicPublish(XXX, XXX, MessageProperties.PERSISTENT_TEXT_PLANT, XXX),第三个参数设置为存储纯文本到磁盘

4. 虚拟主机

  • 每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机都拥有自己的队列、交换机和绑定,拥有自己的权限。
  • RabbitMQ默认的vhost是“/”
  • vhost之间是相互隔离的,多个vhost之间是无法通讯的,因此不用担心命名冲突
  • 创建用户的时候必须指定vhost

5. RabbitMQ如何保证消息不丢失

  • 生产者将数据发送到MQ的时候丢失数据:

    开启confirm机制:不同于事务机制的是,confirm机制是异步的。生产者发送消息后不会阻塞发送下一条消息,当MQ收到消息后会异步回调一个接口通知消息接收到了。

  • MQ收到了消息,还没有消费,消息丢失:

    消息持久化

  • 消费者收到消息,还没有处理,进程挂了,丢失消息:

    关闭消费者自动ACK机制。等消费者消费完成后再通知服务端。

3. SpringBoot整合RabbitMQ

1. 创建项目,并配置application.yml文件

server:port: 8888# rabbitmq配置
spring:rabbitmq:host: 192.168.100.230port: 5672virtual-host: /username: adminpassword: qweqscQAZ123

2. 创建RabbitMQ配置类

package com.example.rabbitdemo.config;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {// 交换机名称public static final String TEST_EXCHANGE = "test_exchange";// 队列名称public static final String TEST_QUEUE = "test_queue";/*** 声明topic交换机* @return*/@Beanpublic Exchange testExchange() {return ExchangeBuilder.topicExchange(TEST_EXCHANGE).durable(true).build();}/*** 声明队列* @return*/@Beanpublic Queue testQueue() {return QueueBuilder.durable(TEST_QUEUE).build();}/*** 绑定交换机和队列* 路由键符合以 topic. 开头的规则即可* @return*/@Beanpublic Binding bindQueueExchange() {return BindingBuilder.bind(testQueue()).to(testExchange()).with("topic.#").noargs();}}

3. 发送消息,并测试

package com.example.rabbitdemo.controller;import com.example.rabbitdemo.config.RabbitConfig;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SendController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendMsg")public String sendMsg(@RequestParam String routingKey, @RequestParam String msg) {try {/*** 发送消息* 参数1:交换机名称* 参数2:路由键,符合topic.#规则即可* 参数3:要发送的消息*/rabbitTemplate.convertAndSend(RabbitConfig.TEST_EXCHANGE, routingKey, msg);} catch (AmqpException e) {return "failed";}return "successed";}
}




4. 接收消息

package com.example.rabbitdemo.component;import com.example.rabbitdemo.config.RabbitConfig;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@RabbitListener(queues = RabbitConfig.TEST_QUEUE) // 监听队列名称
public class RabbitReceiver {@RabbitHandlerpublic void getMsg(String msg) {System.out.println("消费消息: " + msg);}
}

使用postman先发送消息

控制台输出消费后的信息

消息队列中记录数变为0

RabbitMQ原理及SpringBoot整合RabbitMQ相关推荐

  1. rabbit和mysql事务_分布式事务原理及SpringBoot整合RabbitMQ实现可靠事件,TCC事务模型及接口幂等性...

    分布式事务 我们知道在单数据库系统中,实现数据的一致性,通过数据库的事务来处理比较简单.在微服务或分布式系统中,各个独立的服务都会有自己的数据库,而不是在同一个数据库中,所以当一组事务(如商品交易中, ...

  2. RabbitMq详解+SpringBoot整合RabbitMq快速入门

    1概述: 1.1.什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已. 其主要用途:不同进程Pro ...

  3. RabbitMQ 第一天 基础 6 SpringBoot 整合RabbitMQ

    RabbitMQ [黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战] 文章目录 RabbitMQ 第一天 基础 6 SpringBoot 整合RabbitMQ 6.1 Sprin ...

  4. 九、springboot整合rabbitMQ

    springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...

  5. RabbitMQ,RabbitMQ 的工作模式,Spring 整合 RabbitMQ,Springboot 整合RabbitMQ

    什么是RabbitMQ 1.1 MQ概述 MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器.多用于分布式系统之间进行通信. ⚫ MQ,消息队列,存储消息的中间件 ⚫ ...

  6. SpringBoot整合 ActiveMQ、SpringBoot整合RabbitMQ、SpringBoot整合Kafka

    1.概念:SpringBoot 整合消息服务2.具体内容对于异步消息组件在实际的应用之中会有两类:· JMS:代表作就是 ActiveMQ,但是其性能不高,因为其是用 java 程序实现的:· AMQ ...

  7. RabbitMq(九) SpringBoot整合RabbitMQ消费者示例代码

    概述 在上一篇我们介绍了SpringBoot整合RabbitMQ生产者代码,本章我们介绍SpringBoot整合RabbitMQ,实现消费者工程的代码实现.与生产者集成相比,集成消费者不需要进行添加配 ...

  8. RabbitMq(八) SpringBoot整合RabbitMQ 生产者代码实现

    在本章中我们将创建RabbitMQ的生产者工程,并实现生产者端代码实现. springboot整合RabbitMQ生产者工程步骤如下: 创建maven工程 引入springboot及RabbitMQ依 ...

  9. Springboot整合一之Springboot整合RabbitMQ

    前言 目前,springboot已然成为了最热的java开发整合框架,主要是因其简单的配置,并且本身提供了很多与第三方框架的整合,甚至可以让我们在短短的几分钟里就可以搭建一个完整的项目架构.所以,博主 ...

最新文章

  1. 虚拟机使用镜像文件安装系统
  2. Golang Study 三 map的顺序输出
  3. Java设计模式 -- 简单工厂模式(SimpleFactory)
  4. 如何将存储在MongoDB数据库中的数据导出到Excel中?
  5. leetcode486. 预测赢家(动态规划)
  6. 一文带你 GNN 从入门到起飞,做一个饭盆最稳 GNN 饭人!
  7. 简单scrapy爬虫实例
  8. Java实验9 T6.将对象和数组存储在dat文件中
  9. Pandas Series 1
  10. bootstrap table 合并行_elementUI表格合并
  11. CentOS 7.6虚拟机ping: www.baidu.com: Name or service not known
  12. 图形学中常用计算几何总结
  13. win10内置ubuntu, 启动时提示“指定的网络名不再可用”解决办法
  14. AT24Cxx读写全面理解
  15. 50条字面和实际意思大不同的英语
  16. 文件(夹)批量重命名数字、字母、日期、中文数字大写小写
  17. 市场导向还是技术导向
  18. 文件上传绕waf(waf拦不住我)
  19. 2022-2028全球与中国数字化销售室软件市场现状及未来发展趋势
  20. CLIP Learning Transferable Visual Models From Natural Language Supervision (文本和图像的对比学习)--文献翻译和笔记

热门文章

  1. leetcode解题方案--015--3 sum
  2. How to Write and Publish a Scientific Paper-How to Write the Results
  3. Tensorflow实现图像分类
  4. 汽车功能安全理论基础
  5. 3dmax动画导入到Unity1
  6. 记一次华硕F540U加内存条和固态的艰辛历程
  7. 接口继承接口,类实现接口
  8. 人生第一套房_2020年买房详细记录
  9. python怎么设置字体样式_PyQt5 控件字体样式等设置的实现
  10. 乌班图docker版本18.04升级到19.03