RabbitMQ原理及SpringBoot整合RabbitMQ
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相关推荐
- rabbit和mysql事务_分布式事务原理及SpringBoot整合RabbitMQ实现可靠事件,TCC事务模型及接口幂等性...
分布式事务 我们知道在单数据库系统中,实现数据的一致性,通过数据库的事务来处理比较简单.在微服务或分布式系统中,各个独立的服务都会有自己的数据库,而不是在同一个数据库中,所以当一组事务(如商品交易中, ...
- RabbitMq详解+SpringBoot整合RabbitMq快速入门
1概述: 1.1.什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已. 其主要用途:不同进程Pro ...
- RabbitMQ 第一天 基础 6 SpringBoot 整合RabbitMQ
RabbitMQ [黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战] 文章目录 RabbitMQ 第一天 基础 6 SpringBoot 整合RabbitMQ 6.1 Sprin ...
- 九、springboot整合rabbitMQ
springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...
- RabbitMQ,RabbitMQ 的工作模式,Spring 整合 RabbitMQ,Springboot 整合RabbitMQ
什么是RabbitMQ 1.1 MQ概述 MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器.多用于分布式系统之间进行通信. ⚫ MQ,消息队列,存储消息的中间件 ⚫ ...
- SpringBoot整合 ActiveMQ、SpringBoot整合RabbitMQ、SpringBoot整合Kafka
1.概念:SpringBoot 整合消息服务2.具体内容对于异步消息组件在实际的应用之中会有两类:· JMS:代表作就是 ActiveMQ,但是其性能不高,因为其是用 java 程序实现的:· AMQ ...
- RabbitMq(九) SpringBoot整合RabbitMQ消费者示例代码
概述 在上一篇我们介绍了SpringBoot整合RabbitMQ生产者代码,本章我们介绍SpringBoot整合RabbitMQ,实现消费者工程的代码实现.与生产者集成相比,集成消费者不需要进行添加配 ...
- RabbitMq(八) SpringBoot整合RabbitMQ 生产者代码实现
在本章中我们将创建RabbitMQ的生产者工程,并实现生产者端代码实现. springboot整合RabbitMQ生产者工程步骤如下: 创建maven工程 引入springboot及RabbitMQ依 ...
- Springboot整合一之Springboot整合RabbitMQ
前言 目前,springboot已然成为了最热的java开发整合框架,主要是因其简单的配置,并且本身提供了很多与第三方框架的整合,甚至可以让我们在短短的几分钟里就可以搭建一个完整的项目架构.所以,博主 ...
最新文章
- 虚拟机使用镜像文件安装系统
- Golang Study 三 map的顺序输出
- Java设计模式 -- 简单工厂模式(SimpleFactory)
- 如何将存储在MongoDB数据库中的数据导出到Excel中?
- leetcode486. 预测赢家(动态规划)
- 一文带你 GNN 从入门到起飞,做一个饭盆最稳 GNN 饭人!
- 简单scrapy爬虫实例
- Java实验9 T6.将对象和数组存储在dat文件中
- Pandas Series 1
- bootstrap table 合并行_elementUI表格合并
- CentOS 7.6虚拟机ping: www.baidu.com: Name or service not known
- 图形学中常用计算几何总结
- win10内置ubuntu, 启动时提示“指定的网络名不再可用”解决办法
- AT24Cxx读写全面理解
- 50条字面和实际意思大不同的英语
- 文件(夹)批量重命名数字、字母、日期、中文数字大写小写
- 市场导向还是技术导向
- 文件上传绕waf(waf拦不住我)
- 2022-2028全球与中国数字化销售室软件市场现状及未来发展趋势
- CLIP Learning Transferable Visual Models From Natural Language Supervision (文本和图像的对比学习)--文献翻译和笔记