- 生产者发送消息的流程
1. 生产者链接RabbitMQ,建立TCP链接 connection, 开启信道Channel
2. 生产者申明一个Exchange 交换器,并设置相关属性,比如交换机类型,是否持久化等
3. 生产者申明一个队列 设置相关属性,比如是否排他,是否持久化,是否自动删除
4. 生产者通过routingkey (路由key) 将交换器和队列绑定binding起来
5. 生产者发送消息至RabbitMQ Broker, 其中包含routingkey 路由键,交换器等信息
6. 相应的交换器根据接收到的routingkey查找相匹配的队列
7.如果找到,就将从生产者发送过来的消息存入相应的队列中
8. 如果没有找到,则根据生产者配置的属性选择丢弃还是退回给生产者
9. 关闭信道
10. 关闭链接
- 消费者接收消息的过程
1. 消费者链接到rabbitmq broker,建立一个连接 connection,开启一个信道Channel
2. 消费者向rabbitmq broker请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作
3. 等待 rabbitMQ broker 回应并投递相应队列中的消息,消费者接收消息
4. 消费者确认ack 收到的消息
5. mq 重队列中删除相应已经被确认的消息
6.关闭信道
7.关闭连接
交换机的申明
channel.exchangeDeclare(参数1, 参数2,参数3,参数4,参数5);
参数1 //交换器名称
参数2 //BuiltinExchangeType DIRECT、FANOUT,TOPIC,HEADERS
参数3 //交换器是否是持久的
参数4 //如果borker重启时是否删除 交换器没有排他的说法
参数5 //其他参数
队列的申明
channel.queueDeclare(参数1, 参数2,参数3,参数4,参数5);
参数1 //申明消息队列名称
参数2 //durable 是否是持久化的,如果rabbit mq重启了消息队列是否还存在
参数3 //exclusive 意思是排他,只能有你当前的连接自己消费使用
参数4 //autoDelete 如果消息队列没有了consumer 监听,系统就会自动删除这个消息队列
参数5 //消息队列属性信息
-
测试case1:
channel.exchangeDeclare("ex.tgo", BuiltinExchangeType.DIRECT,false,false,null);
重启broker后
Note: 说明 交换机参数2(交换器是否是持久)如果我们不持久交换机,borker重启后,交换机自动被删除。
测试case2:交换机持久化
channel.queueDeclare("queue.tgobatch",false,false,true,null);
重启broker后
Note: 说明 队列参数2(队列是否是持久)如果我们不持久队列,borker重启后,队列自动被删
-
测试case3:队列持久化
channel.exchangeDeclare("ex.tgo", BuiltinExchangeType.DIRECT,false,false,null);
channel.queueDeclare("queue.tgobatch",true,false,true,null);
若果我们不持久化交换机,只持久化队列
重启broker后
Note: 我们发现重启后交换机没有了,队列还在,但是队列和交换机的绑定信息被删除了
-
测试case4: 排他性
channel.exchangeDeclare("ex.tgo", BuiltinExchangeType.DIRECT,true,false,null);
排他性只针对队列
channel.queueDeclare("queue.tgobatch",true,true,false,null);
需要java代码测试,这里不做截图,直说结论
Note: 排他性指的是,你只能使用同一个connection链接推送和消费,只对首次声明它的连接(Connection)可见。
1.如果你再次新申明一个ConnectionFactory,绑定同样的消息队列,这个新的consumer消息不但消费不到,还会报错,因为它会尝试去创建一个已有队列,不论是交换机的属性还是队列的属性都是不允许重复申明的(这里的属性指的是属性设置完全一样,包括队列/交换机的名字)。
2.排他性还有一个重要的特定那就是connection断开后,独用的队列/交换机会被自动删除。
测试case5: 自动删除
这个就比较容易理解了
交换机:如果borker重启时是否删除 交换器没有排他的说法
队列:如果消息队列没有了consumer 监听,系统就会自动删除这个消息队列
关于更多rabbit
(144条消息) RabbitMQ 在微服务多实例中的应用案例_TGO-Ming的博客-CSDN博客