RabbitMQ安装
使用docker 快速安装
1、拉取镜像
java
docker pull rabbitmq:management
2、启动容器
java
docker run -d \
--name rabbitmq \
--hostname rabbit-node \
-p 5672:5672 \
-p 15672:15672 \
-v rabbitmq_data:/var/lib/rabbitmq \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin123 \
rabbitmq:management
参数说明
-d:后台守护运行--hostname:必须指定,Erlang 节点名依赖 hostname,随机主机名会丢数据Amazon ECR...5672:AMQP 端口,代码连接 MQ 用15672:Web 管理后台端口-v rabbitmq_data:/var/lib/rabbitmq:数据卷持久化,删除容器消息不丢失- 环境变量:自定义管理员账号密码(guest 默认只能本地访问,远程不能用)
3、验证
浏览器访问:http://localhost:15672/,输入容器启动时的账号密码。

简单消息发送及消费
1、在管理页面新增一个简单队列

2、新建一个项目,导入mvc及mq依赖
springboot 版本为:4.1.1

配置文件添加mq的配置

3、新建一个消息发送者
使用容器注入的RabbitTemplet,设置路由key为队列名就能发送消息

4、新建一个消费者
消费者通过@RabbitListener实现对队列的监听

简单消息-多个消费者
一个队列可以同时被多个消费者监听,默认通过轮询方式将消息发送给多个消费者,一个消息只会被消费一次。

若是消费者之间消费能力不一样,可以设置prefetch为1,表示消费消息时最多预取1条,消费完了再从队列中拿


当消费者1处理速度大于消费者2时,它能处理更多消息。
消息发送消费流程
生产者生产消息->交换机->队列->消费者
扇出交换机(Fanout)
类似于广播,当生产者指定了类型为fanout的交换机,消息将投递给该交换机绑定的所有队列,消费者监听对应队列就能完成消费。
1、新建一个fanout类型的交换机:my.fanout

2、新建两个队列:fanout.queue1、fanout.queue2

3、交换机绑定绑定两个队列

4、新建一个消息生成者,将消息发送到my.fanout,路由key为空

消息发送后两个队列都能收到

5、消费者监听指定队列就能完成消费

直连交换机(Direct)
直接交换机绑定队列时需要指定路由key,路由key完全匹配消息才会投递到队列。
1、创建类型为Direct的交换机

2、创建两个队列direct.queue1、direct.queue2

3、为交换机绑定队列,绑定队列时需要指定路由key
绑定direct.queue1时,绑定路由key为 red、和blue;direct.queue2绑定路由key为:blue、black。

4、创建生产者投递消息
生产者指定交换机为my.direct,分别发送3条不同的路由key

5、消费者分别指定direct.queue1和direct.queue2
因为red 只有queue1有绑定,所以只会发给queue1,black只有queue2绑定所以只会发给queue2,blue两个队列都有绑定,所以会同时投递

主题交换机(Topic)
主题交换机与直接交换机类似,但比直接交换机灵活。topic路由key由"."分割,例如:china.news、china.weather。特别的:"#" 表示匹配0个或多个、"*"表示匹配一个。"china.#" 可以匹配:china、china.news、china.weahter、china.news.cd等;但是"china.*" 只能匹配:china.news或china.weather,不能匹配:china或china.news.cd。
1、新增交换机类型指定为topic

2、新增两个队列topic.queue1、topic.queue2

3、交换机绑定队列
队列1接收所有china开头的路由消息,队列2接收两段路由,其中第二段为weather。

4、创建消息生产者
指定交换机为my.topic,分别发送路由key:china.weather、china.weather.cd、japan.weather、xxx.yyy四条消息。
topic.queue1:china.weather、china.weather.cd 两条消息
topic.queue2:china.weather、japan.weather 两条消息
xxx.yyy 由于没有绑定关系能匹配,该消息将丢失

5、消费者绑定topic.queue1和topic.queue2

代码中创建交换机、队列及绑定关系
使用RabbitMQ,首先需要创建交换机、队列和绑定关系。这些可以通过管理页面直接添加,也可以通过代码的方式添加。交换机、队列及绑定关系一般在消费者中创建。
1、配置类
通过注入配置类完成对应创建。例如:创建一个fanout类型的交换机,名字为:my.fanout2,创建两个队列:fanout2.queue1、fanout2.queue2。交换机创建两个绑定关系分别绑定两个队列。

启动后观察控制页面:



2、注解
交换机、队列及绑定关系可以直接在@RabbitListener注解中指定。例如创建一个直连交换机名称为:direct2.exchange,创建两个队列分别为:direct2.queue1、direct2.queue1,队列1路由key为:red、blue,队列2路由key为:blue、black。

控制台可查看交换机、队列及绑定关系

