一.在linux上安装插件
1.加载插件
输入命令 yum -y install epel-release
加载插件 yum -y install socat
2.在/usr/src下创建一个RabbitMQ目录,将MQ下载在这个目录下
3.安装erlang环境
在/usr/src/RabbitMQ 目录下将MQ需要的两个安装包放进去,进行安装命令,在linux粘贴: insert + shift
yum install -y esl-erlang_22.1.8-1_centos_7_amd64.rpm
4.安装RabbitMQ
yum install -y rabbitmq-server-3.8.1-1.el7.noarch.rpm
5.启动服务
1)启动服务
输入命令,启动服务
service rabbitmq-server start
停止服务
service rabbitmq-server stop
重启服务
service rabbitmq-server restart
2)开启管理插件
rabbitmq-plugins enable rabbitmq_management
3)修改主机名,将自己的主机名添加到hosts中
vi /etc/hosts
4).关闭防火墙
只关闭一次
systemctl stop firewalld
永久关闭
systemctl disable firewalld
5).添加用户名
rabbitmqctl add_user 用户名 密码
6).给用户权限,超级管理员
rabbitmqctl set_user_tags 用户名 administrator
二.MQ的实际应用
1.简单类型
重点执行流程
2. ### 解决方法(手动ack确认):
3
2.Work模式
-
消费者默认是轮循机制,一人一条
-
若让一个消费者在读取消息的时候睡了1秒,那么会造成第二个消费者已经将自己的轮循消息处理完了,第一个消费者还在慢慢的处理自己被分配的消息,工作效率低
-
需要在声明队列后添加一个每个消费者同时只能处理一条消息
-
原因:处理完消息后,那个线程还处于睡眠状态
模式机制
3.fanout(扇形;广播;交换机)
不同
4.Direct(定向发送)
4.1 发送者 交换机通过广播形式,以暗号对应,哪个队列可以对的上就将哪个消息放到队列中
4.2 接收者
接收者2
问题:
如果我的rabbitMQ突然宕机了,交换机没有持久化,消息就丢失了,队列也没有持久化
解决
1.发送者将交换机,消息持久化
2.消费者将队列持久化
5.Topics(消息持久化以及*,#)
5.1生产者 MessageProperties的静态方法可以保证消息的持久化
5.2消费者 1.1
图有错: #是匹配所有 *是匹配一级目录
user.# 匹配所有user.下的路径: user.a user.a.a.a 不管几层目录都可以
user.* 只可以匹配user下的一层路径 例如 user.a user.b user.c
#.user 只要是user结尾的都可以
*.user 只能是a.user b.user c.user
5.3 注意 坑
1.若发送者定义了交换机持久化以及消息持久化
2.那么消费者绑定交换机时也应将持久化开开,否者报异常,客户端连接不上;队列也开启持久化
三.SpringBoot整合RabbitMQ
1.引入依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2.配置yaml文件
-
spring: rabbitmq: host: 192.168.92.128 username: lzj password: lzj virtual-host: new #虚拟主机名称 port: 5672
3.发消息
-
单元测试类中发送消息
-
@Autowired private AmqpTemplate amqpTemplate; @Test public void sendMessage(){ String msg="你好!!!!"; amqpTemplate.convertAndSend("heima.topic.exchange", "a.insert", msg); }
4.消费者消费消息
-
自定义一个类
1.这个类只负责监听已有的队列,不负责创建新的队列
2.接收消息的类型与队列中已有的消息数据类型相对应
5.修改发送消息的格式为json格式
-
不修改,jdk自带
5.2源码跟踪
- 发送消息的接口进入
6.Java代码注解方式绑定交换机,队列,routekey
发消息还是测试类发送消息
-
进源码
-
-
-
-
-
-
-
更换发送消息的序列化格式
- 更换转换格式的原理
7.Java方式使用Bean注入,绑定交换机,队列,消息
7.1只适用于接收消息,发送消息仍需测试类
7.2测试类启动,会加载整个SpringBoot
- 启动类中注入Bean,完成绑定以及创建交换机和队列
- 监听自定义的队列