RabbitMQ 队列和交换机的申明参数

  • 生产者发送消息的流程

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);

RabbitMQ 队列和交换机的申明参数_第1张图片

重启broker后

 RabbitMQ 队列和交换机的申明参数_第2张图片

 Note: 说明 交换机参数2(交换器是否是持久)如果我们不持久交换机,borker重启后,交换机自动被删除。

 测试case2:交换机持久化
channel.queueDeclare("queue.tgobatch",false,false,true,null);
RabbitMQ 队列和交换机的申明参数_第3张图片
重启broker后

 RabbitMQ 队列和交换机的申明参数_第4张图片
Note: 说明 队列参数2(队列是否是持久)如果我们不持久队列,borker重启后,队列自动被删

  •  测试case3:队列持久化

channel.exchangeDeclare("ex.tgo", BuiltinExchangeType.DIRECT,false,false,null);
channel.queueDeclare("queue.tgobatch",true,false,true,null);
若果我们不持久化交换机,只持久化队列

RabbitMQ 队列和交换机的申明参数_第5张图片
RabbitMQ 队列和交换机的申明参数_第6张图片
RabbitMQ 队列和交换机的申明参数_第7张图片

重启broker后
 RabbitMQ 队列和交换机的申明参数_第8张图片

 RabbitMQ 队列和交换机的申明参数_第9张图片

 RabbitMQ 队列和交换机的申明参数_第10张图片

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博客

你可能感兴趣的:(java-rabbitmq,rabbitmq,分布式)