参考 【RabbitMQ】RabbitMQ架构模型_rabbitmq结构模型-CSDN博客
之前的学习都只是知道名字,但并没有真正的理解,每次看还是不懂,所以今日理解透 !
RabbitMQ 收发消息过程如下:
首先从消费者开始:
每个消费者都有一个自己的队列,每个消费者都从自己的队列中取消息 消费。
消费者代码表示如下:
直接就是监听一个队列
org.springframework.amqp.rabbit.annotation.RabbitListener
生产者将消息发给交换机,交换机将消息发给 队列
下图:p 为生产者,x 为交换机
消费者不与队列交互,只给交换机发送,交换机再把消息转发给指定队列,消费者监听到自己的队列有消息了,就可以消费了。
那么 交换机如何知道要把 消息转发给 那个或哪些队列呢?
首先可能存在多个交换机,所以 队列是需要绑定到交换机的,交换机转发消息时 可选择的队列列表 只能是绑定到它的 队列。
然后怎么知道转发到哪个队列呢?
这得看交换机类型:Fanout 广播、Direct 定向、Topic 通配符
1. Fanout 广播交换机
广播就是将消息转发给 绑定到该交换机的 全部队列上。
2. Direct 定向交换机
模型如上:
首先 队列绑定到交换机的时候 需要同时指定一个 bindingKey
如图:C1 的 bindingKey 是 error; C2 的 bindingKey 是 info、error、warning;
然后,生产者发送消息的时候就要传这个值了:比如 传一个 info,那么 交换机就会把消息转发给 绑定了 info 的队列 C2 上。
生产者传的这个值 叫做 routingKey 路由key
消费者绑定交换机的值叫做 bindingKey 绑定key
所以消费者最终发的消息是:消息要发给哪个交换机的哪个 bindingKey 的队列上。
(消费者传参时参数叫做 routingKey,实际上是和 bindingKey 相等的,叫法不同)
3. Topic 通配符交换机
通配符交换机可以解析 routingKey 上的通配符,来转发消息
看看代码如何表示以上关系
1. 定义交换机
直接通过Builder 可以构造出不同类型的交换机
2. 定义队列
3. 队列和交换机绑定
4. 发送消息
如图发了一个延迟消息
发送消息时,第一个参数指定交换机,第二个参数指定routingKey,第三个参数为要发送的消息内容