当前位置:   article > 正文

java实现RabbitMQ消息队列_java rabbit

java rabbit

目录

一、什么是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

rabbitmq官网首页

进入官网向下拉,找到 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引入依赖

  1. <!-- MQ客户端 -->
  2. <dependency>
  3. <groupId>com.rabbitmq</groupId>
  4. <artifactId>amqp-client</artifactId>
  5. <version>5.8.0</version>
  6. </dependency>
  7. <!-- 文件读取 -->
  8. <dependency>
  9. <groupId>commons-io</groupId>
  10. <artifactId>commons-io</artifactId>
  11. <version>2.6</version>
  12. </dependency>

一、简单模型(simple)

就是一个生产者一个消费者,中间通过一个队列直接连接。

在这里插入图片描述

1、创建生产者,发消息,创建Producer.class文件

  1. public static final String QUEUE_NAME = "hello";
  2. public static void main(String[] args) throws IOException, TimeoutException {
  3. // 创建一个连接工厂
  4. ConnectionFactory factory = new ConnectionFactory();
  5. // 工厂IP,连接RabbitMQ的队列
  6. factory.setHost("127.0.0.1");
  7. // 用户名
  8. factory.setUsername("guest");
  9. // 密码
  10. factory.setPassword("guest");
  11. // 创捷连接
  12. Connection connection = factory.newConnection();
  13. // 创建信道
  14. Channel channel = connection.createChannel();
  15. /**
  16. * 生成一个队列
  17. * 1、队列名称
  18. * 2、队列里面的消息是否持久化,默认情况消息存储再内存中,设置true保存磁盘中
  19. * 3、该队列是否只供一个消费者消费,true可以多个消息者消费,false只能一个
  20. * 4、是否自动删除,ture自动删除,false不自动删除
  21. * 5、其他参数
  22. */
  23. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  24. // 发消息
  25. String message = "hello word";
  26. /**
  27. * 发送一个消费
  28. * 1、发送到那个交换机
  29. * 2、路由的key值是那个 ,本次是队列的名称
  30. * 3、其他参数
  31. * 4、发送消息的消息体
  32. */
  33. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  34. }

2、消费者,接收消息,Consumer.class文件

  1. // 队列的名称
  2. public static final String QUEUE_NAME = "hello";
  3. // 接收消息
  4. public static void main(String[] args) throws IOException, TimeoutException {
  5. // 创建连接工厂
  6. ConnectionFactory factory = new ConnectionFactory();
  7. // 工厂IP,连接RabbitMQ的队列
  8. factory.setHost("127.0.0.1");
  9. // 用户名
  10. factory.setUsername("guest");
  11. // 密码
  12. factory.setPassword("guest");
  13. // 创捷连接
  14. Connection connection = factory.newConnection();
  15. // 创建信道
  16. Channel channel = connection.createChannel();
  17. // 消费者未成功的回调
  18. DeliverCallback deliverCallback = (consumerTag, message) ->
  19. System.out.println("接收到的消息" + new String(message.getBody()));
  20. // 消费者取消消费的回调
  21. CancelCallback cancelCallback = consumerTag -> System.out.println("消息中断");
  22. /**
  23. * 1、消费那个队列
  24. * 2、消费成功后是否自动确认
  25. * 3、消费者未成功的回调
  26. * 4、消费者取消消费的回调
  27. */
  28. channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
  29. }

二、工作模式(work queues)

        就是有多个消费者消费队列里的消息,队列里的消息只能被一个消费者消费,这样多部署几个消费者,就可以缓解压力,比如过年的时候抢票,抢票成功后会给你发短信,这个时候就可以把发短信的任务放入队列里,然后有多个发短信的服务来处理队列里的任务。

注意事项:一个消息只能被处理一次,不可以处理多次,需要采用轮训处理

 1、创建工具类RabbitMqUtils.class,后面创建信道使用工具类

  1. public class RabbitMqUtils {
  2. /**
  3. * 创建信道工具方法
  4. *
  5. * @return
  6. * @throws Exception
  7. */
  8. public static Channel getChannel() throws Exception {
  9. // 创建连接工厂
  10. ConnectionFactory factory = new ConnectionFactory();
  11. // 工厂IP,连接RabbitMQ的队列
  12. factory.setHost("127.0.0.1");
  13. // 用户名
  14. factory.setUsername("guest");
  15. // 密码
  16. factory.setPassword("guest");
  17. // 创捷连接
  18. Connection connection = factory.newConnection();
  19. // 创建信道
  20. return connection.createChannel();
  21. }
  22. }

2、创建工作线程Work.class文件

  1. public class Work01 {
  2. // 队列名称
  3. public static final String QUEUE_NAME = "hello";
  4. //接收消息
  5. public static void main(String[] args) throws Exception {
  6. Channel channel = RabbitMqUtils.getChannel();
  7. // 消息的接收
  8. DeliverCallback deliverCallback = (consumerTag, message) -> System.out.println("接
  9. 收到的消息" + new String(message.getBody()));
  10. // 消费者取消消费的回调
  11. CancelCallback cancelCallback = consumerTag -> System.out.println("消息中断");
  12. /**
  13. * 1、消费那个队列
  14. * 2、消费成功后是否自动确认
  15. * 3、消费者未成功的回调
  16. * 4、消费者取消消费的回调
  17. */
  18. System.out.println("C1等待消息....");
  19. channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
  20. }
  21. }

备注:依次类推,创建多个work线程文件 ,或者多次执行work01方法,创建多个线程

 3、创建发送消息文件Task01.class

  1. public class Task01 {
  2. // 队列名称
  3. public static final String QUEUE_NAME = "hello";
  4. public static void main(String[] args) throws Exception {
  5. Channel channel = RabbitMqUtils.getChannel();
  6. /**
  7. * 队列声明
  8. * 生成一个队列
  9. * 1、队列名称
  10. * 2、队列里面的消息是否持久化,默认情况消息存储再内存中,设置true保存磁盘中
  11. * 3、该队列是否只供一个消费者消费,true可以多个消息者消费,false只能一个
  12. * 4、是否自动删除,ture自动删除,false不自动删除
  13. * 5、其他参数
  14. */
  15. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  16. // 从控制台当中接收信息
  17. Scanner scanner = new Scanner(System.in);
  18. while (scanner.hasNext()) {
  19. String message = scanner.next();
  20. /**
  21. * 发送一个消费
  22. * 1、发送到那个交换机
  23. * 2、路由的key值是那个 ,本次是队列的名称
  24. * 3、其他参数
  25. * 4、发送消息的消息体
  26. */
  27. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  28. System.out.println("发送完成");
  29. }
  30. }
  31. }

发送完,后台接收到信息

三、发布订阅模式(Publish/Subscibe)

上面两种模式生产者的消息只能被一个消费者消费,不符合某些实际场景。

假如我们有一个国家气象局天气预报系统,这个时候他发送消息,其他的服务商,比如百度、网易、腾讯等公司都要从国家天气预报系统那里获取天气怎么办呢?

总不能百度获取了今天的天气其他公司就获取不了天气了吧,或者让国家天气预报系统给每个服务商都发送一次消息,那样显然是很麻烦的。

所以我们需要用到一个Exchange交换机角色来帮助我们把消息发给所有订阅我们的服务商。

 在这里插入图片描述

四、路由模式 (Routing)

        路由模式就是交换机并不是给所有订阅他的队列发送消息了,而是根据路由键来确定应该给哪个队列发送消息,队列和交换机绑定的时候需要通过路由键,而生产者发送消息的时候也需要指定路由键,这样就可以确定给哪个队列发送消息了。

这里我们可以看到是给张三发送消息,所以只会给路由键为张三的那个队列发送消息。

在这里插入图片描述

五、主题模式(Topics)

        主题模式就相当于模糊匹配,假如我想给姓张的发送消息,那么我就可以通过主题模式给所有姓张的发送消息。 

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/614587
推荐阅读
相关标签
  

闽ICP备14008679号