java实现RabbitMQ消息队列
目录
一、什么是MQ?
二、为什么要用MQ?
流量消锋
应用解耦
异步处理
三、MQ分类和使用场景
四、安装MQ
1、准备工作
2、开始安装
3、结束安装
五、实践操作:
一、简单模型(simple)
二、工作模式(work queues)
三、发布订阅模式(Publish/Subscibe)
四、路由模式 (Routing)
五、主题模式(Topics)
一、什么是MQ?
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。
MQ相关核心部分
核心部分,分为6大部分1、简单模式(simple) 2、工作模式(Work queues) 3、发布订阅模式(Publish/Subscribe) 4、路由模式(Routing) 5、主题模式(Topics) 6、发布确认模式(Publisher Confirms)高级部分 1、死信队列 2、延迟队列 3、发布确认高级a、发布确认b、回退消息c、备份交换机 4、冥等性 5、优先级队列 6、惰性队列集群部分1、Clustering 2、镜像队列 3、HAProxy + Keepalive实现高可用负载均衡 4、Federation Exchange 5、Federation Queue 6、Shovel
二、为什么要用MQ?
流量消锋
应用解耦
异步处理
三、MQ分类和使用场景
名称 | 场景 |
ActiveMQ | |
Kafka | 大公司、大数据 |
RocketMQ | 金融、互联网、双11 |
RabbitMQ | 高并发,中小企业 |
MQ关系图如下:
四、安装MQ
1、准备工作
这里通过官网下载需要的版本:RabbitMQ官方网址
百度云下载:
otp_win64_24.3.3
链接:https://pan.baidu.com/s/1pY5KA9jrtQoQQ7-0_kslaQ?pwd=6666
提取码:6666
rabbitmq-server-3.8.16
链接:https://pan.baidu.com/s/1ts21fmA8cYRbLw76nK8Vvw?pwd=6666
提取码:6666
进入官网向下拉,找到 Download + Installation 下载+安装,点击进入。
在新页面找到右侧,Install Windows 安装windows版本
然后页面下拉,找到 Dependencies 依赖关系
选择otp_win64_24.1.7.exe 我的系统是64位的,所以下载win64
这里笔者强调一下。我安装的是最新版本。如果你们觉得最新版可能存在未知bug或不兼容问题,可以选择自己想要下载的对应版本即可。
这里我截图一部分版本参照表,其他的可以自行查看
2、开始安装
第一步:找到我们下载的软件位置。
第二步:先安装otp_win64_24.1.7.exe
第三步:鼠标右键以管理员方式运行
第四步:接着选取要安装的路径,然后一路傻瓜式安装 next 下一步,安装即可。
【注意】不要安装在中文或带空格的文件路径下
第五步:配置系统环境变量
右键此电脑 - 属性 - 高级系统设置 - 环境变量
接着打开 - 此电脑(文件资源管理器) 找到刚刚我们安装的 erl - 24.1.7 文件 bin 目录下,复制路径 ctrl+c
切换窗口到环境变量,找到系统变量 path - 编辑
新建 - ctrl + v 粘贴刚才我们复制的路径,然后三次确定,关闭环境变量窗口
第六步:安装 RabbitMQ
右键管理员运行,然后选择安装路径,接着一路 next 下一步,遇到弹窗点允许,没有弹窗则无视。
【注意】不要安装在中文或带空格的文件路径下
第七步:安装完成后找到安装文件路径,找到 sbin 目录下,全选路径 输入 cmd
打开cmd命令窗口。
运行下面命令,回车运行。
rabbitmq-plugins enable rabbitmq_management
第八步:打开任务资源管理器。win11 快捷键 Ctrl+Shift+Esc,找到rabbitmq服务右键重新启动。
3、结束安装
打开浏览器。访问 http://127.0.0.1:15672
出现管理页面:
账号:guest
密码:guest
登录成功后。进入下面页面即代表安装成功。至此大功告成。是不是很简单!
如果不小心安装到中文或带空格路径文件路径下,这个链接可以解决:
https://blog.csdn.net/leoma2012/article/details/97636859
如果想要彻底卸载RabbitMQ,则访问这个链接:
https://blog.csdn.net/qq_41463655/article/details/86747917
安装原文链接:https://blog.csdn.net/tirster/article/details/121938987
五、实践操作:
首先pom.xml引入依赖
<!-- MQ客户端 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</version></dependency><!-- 文件读取 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>
一、简单模型(simple)
就是一个生产者一个消费者,中间通过一个队列直接连接。
1、创建生产者,发消息,创建Producer.class文件
public static final String QUEUE_NAME = "hello";public static void main(String[] args) throws IOException, TimeoutException {// 创建一个连接工厂ConnectionFactory factory = new ConnectionFactory();// 工厂IP,连接RabbitMQ的队列factory.setHost("127.0.0.1");// 用户名factory.setUsername("guest");// 密码factory.setPassword("guest");// 创捷连接Connection connection = factory.newConnection();// 创建信道Channel channel = connection.createChannel();/*** 生成一个队列* 1、队列名称* 2、队列里面的消息是否持久化,默认情况消息存储再内存中,设置true保存磁盘中* 3、该队列是否只供一个消费者消费,true可以多个消息者消费,false只能一个* 4、是否自动删除,ture自动删除,false不自动删除* 5、其他参数*/channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 发消息String message = "hello word";/*** 发送一个消费* 1、发送到那个交换机* 2、路由的key值是那个 ,本次是队列的名称* 3、其他参数* 4、发送消息的消息体*/channel.basicPublish("", QUEUE_NAME, null, message.getBytes());}
2、消费者,接收消息,Consumer.class文件
// 队列的名称public static final String QUEUE_NAME = "hello";// 接收消息public static void main(String[] args) throws IOException, TimeoutException {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();// 工厂IP,连接RabbitMQ的队列factory.setHost("127.0.0.1");// 用户名factory.setUsername("guest");// 密码factory.setPassword("guest");// 创捷连接Connection connection = factory.newConnection();// 创建信道Channel channel = connection.createChannel();// 消费者未成功的回调DeliverCallback deliverCallback = (consumerTag, message) -> System.out.println("接收到的消息" + new String(message.getBody()));// 消费者取消消费的回调CancelCallback cancelCallback = consumerTag -> System.out.println("消息中断");/*** 1、消费那个队列* 2、消费成功后是否自动确认* 3、消费者未成功的回调* 4、消费者取消消费的回调*/channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);}
二、工作模式(work queues)
就是有多个消费者消费队列里的消息,队列里的消息只能被一个消费者消费,这样多部署几个消费者,就可以缓解压力,比如过年的时候抢票,抢票成功后会给你发短信,这个时候就可以把发短信的任务放入队列里,然后有多个发短信的服务来处理队列里的任务。
注意事项:一个消息只能被处理一次,不可以处理多次,需要采用轮训处理
1、创建工具类RabbitMqUtils.class,后面创建信道使用工具类
public class RabbitMqUtils {/*** 创建信道工具方法** @return* @throws Exception*/public static Channel getChannel() throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();// 工厂IP,连接RabbitMQ的队列factory.setHost("127.0.0.1");// 用户名factory.setUsername("guest");// 密码factory.setPassword("guest");// 创捷连接Connection connection = factory.newConnection();// 创建信道return connection.createChannel();}
}
2、创建工作线程Work.class文件
public class Work01 {// 队列名称public static final String QUEUE_NAME = "hello";//接收消息public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();// 消息的接收DeliverCallback deliverCallback = (consumerTag, message) -> System.out.println("接 收到的消息" + new String(message.getBody()));// 消费者取消消费的回调CancelCallback cancelCallback = consumerTag -> System.out.println("消息中断");/*** 1、消费那个队列* 2、消费成功后是否自动确认* 3、消费者未成功的回调* 4、消费者取消消费的回调*/System.out.println("C1等待消息....");channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);}
}
备注:依次类推,创建多个work线程文件 ,或者多次执行work01方法,创建多个线程
3、创建发送消息文件Task01.class
public class Task01 {// 队列名称public static final String QUEUE_NAME = "hello";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();/*** 队列声明* 生成一个队列* 1、队列名称* 2、队列里面的消息是否持久化,默认情况消息存储再内存中,设置true保存磁盘中* 3、该队列是否只供一个消费者消费,true可以多个消息者消费,false只能一个* 4、是否自动删除,ture自动删除,false不自动删除* 5、其他参数*/channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 从控制台当中接收信息Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {String message = scanner.next();/*** 发送一个消费* 1、发送到那个交换机* 2、路由的key值是那个 ,本次是队列的名称* 3、其他参数* 4、发送消息的消息体*/channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println("发送完成");}}
}
发送完,后台接收到信息
三、发布订阅模式(Publish/Subscibe)
上面两种模式生产者的消息只能被一个消费者消费,不符合某些实际场景。
假如我们有一个国家气象局天气预报系统,这个时候他发送消息,其他的服务商,比如百度、网易、腾讯等公司都要从国家天气预报系统那里获取天气怎么办呢?
总不能百度获取了今天的天气其他公司就获取不了天气了吧,或者让国家天气预报系统给每个服务商都发送一次消息,那样显然是很麻烦的。
所以我们需要用到一个Exchange交换机角色来帮助我们把消息发给所有订阅我们的服务商。
四、路由模式 (Routing)
路由模式就是交换机并不是给所有订阅他的队列发送消息了,而是根据路由键来确定应该给哪个队列发送消息,队列和交换机绑定的时候需要通过路由键,而生产者发送消息的时候也需要指定路由键,这样就可以确定给哪个队列发送消息了。
这里我们可以看到是给张三发送消息,所以只会给路由键为张三的那个队列发送消息。
五、主题模式(Topics)
主题模式就相当于模糊匹配,假如我想给姓张的发送消息,那么我就可以通过主题模式给所有姓张的发送消息。
java实现RabbitMQ消息队列相关推荐
- 大数据互联网架构阶段 QuartZ定时任务+RabbitMQ消息队列
QuartZ定时任务+RabbitMQ消息队列 一 .QuartZ定时任务解决订单系统遗留问题 情景分析: 在电商项目中 , 订单生成后 , 数据库商品数量-1 , 但是用户迟迟不进行支付操作 , 这 ...
- 使用EasyNetQ组件操作RabbitMQ消息队列服务
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...
- 初探 RabbitMQ 消息队列
初探 RabbitMQ 消息队列 rabbitmq基础概念常见应用场景导入依赖属性配置具体编码定义队列实体类控制器消息消费者主函数测试总结说点什么 SpringBoot 是为了简化 Spring 应用 ...
- 消息队列——RabbitMQ消息队列集群
RabbitMQ消息队列集群 消息队列/中间件 RabbitMQ详解 RabbitMQ单机部署 RabbitMQ集群部署 消息队列/中间件 一.前言 在我们秒杀抢购商品的时候,系统会提醒我们稍等排队中 ...
- RabbitMQ消息队列常见面试题总结
1.什么是消息队列: 1.1.消息队列的优点: (1)解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的.消息 ...
- RabbitMQ消息队列(一)《Java-2021面试谈资系列》
RabbitMQ RabbitMQ消息队列 一.中间件 1.什么是中间件 2.中间件技术及架构概述 3.消息中间件 1.消息中间件的分布式架构 2.消息中间件使用场景 3.常见的消息中间件 4.消息中 ...
- JAVA03_21学习总结(RabbitMQ消息队列)
今日内容 1. RabbitMQ 消息队列 Rabbitmq 消息队列基于AMQP协议的消息队列就是将本来一次性完成的,耗时的,需要等待的操作分离出来-形成一个单独的模块,就是消息队列-例子:普通方式 ...
- RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列
上一篇已经讲了Rabbitmq如何在Windows平台安装,不懂请移步:RabbitMQ学习系列一:windows下安装RabbitMQ服务 一.理论: .net环境下,C#代码调用RabbitMQ消 ...
- RabbitMQ消息队列(十三)-VirtualHost与权限管理
像mysql有数据库的概念并且可以指定用户对库和表等操作的权限.那RabbitMQ呢?RabbitMQ也有类似的权限管理.在RabbitMQ中可以虚拟消息服务器VirtualHost,每个Virtua ...
最新文章
- ArrayList, LinkedList , Vector
- Wannafly 挑战赛16 A 取石子
- Android_Servlet验证的简单登录程序
- Nginx的rewrite之set指令
- Linux命令简单操作之lsof
- Java阶段2-02JS:07JS中的事件
- 宝塔面板如何将数据自动备份到阿里云OSS对象存储
- 解决Android Studio连接不到ios模拟器问题
- python selenium爬虫入门案例day04:Vhiphop街舞视频
- Android 集成支付宝支付
- 微信公众平台后台数据如何分析
- linux tahoma字体,Linux字体安装与简单美化(实践篇)(转)
- 实验一:信息隐藏与数字水印
- 网页版2048html制作,基于HTML+CSS+JS的网页版2048的实现.pdf
- python制作一个计时器_用Python制作一个猫咪小秒表
- 分类任务如何用逻辑回归实现_【机器学习面试总结】—— LR(逻辑回归)
- matlab-----除去图像中的小圆圈
- 驱动开发:运用VAD隐藏R3内存思路
- 什么是IMEI / MEID?他们有什么不同?
- 连续状态转移算法(STA)的实现(python版)