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 //消息队列属性信息
channel.exchangeDeclare("ex.tgo", BuiltinExchangeType.DIRECT,false,false,null);
重启broker后
Note: 说明 交换机参数2(交换器是否是持久)如果我们不持久交换机,borker重启后,交换机自动被删除。
Note: 说明 队列参数2(队列是否是持久)如果我们不持久队列,borker重启后,队列自动被删
channel.exchangeDeclare("ex.tgo", BuiltinExchangeType.DIRECT,false,false,null);
channel.queueDeclare("queue.tgobatch",true,false,true,null);
若果我们不持久化交换机,只持久化队列
Note: 我们发现重启后交换机没有了,队列还在,但是队列和交换机的绑定信息被删除了
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断开后,独用的队列/交换机会被自动删除。
这个就比较容易理解了
交换机:如果borker重启时是否删除 交换器没有排他的说法
队列:如果消息队列没有了consumer 监听,系统就会自动删除这个消息队列
关于更多rabbit
(144条消息) RabbitMQ 在微服务多实例中的应用案例_TGO-Ming的博客-CSDN博客