DIRECT模式:
#设置交换器名称
mq.config.exchange=log.direct
#info队列名称
mq.config.queue.info=log.info
#info路由键
mq.config.queue.info.routing.key=log.info.routing.key
#error队列名称
mq.config.queue.error=log.error
#error路由键
mq.config.queue.error.routing.key=log.error.routing.key
在direct路由中, 队列和路由键是一一对应的。 也就是说, 一个 队列要有一个路由键, 一个路由键唯一确定又给队列。
在创建消费者时,在类前设置如下参数:
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${mq.config.queue.info}" , autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange}" , type = ExchangeTypes.DIRECT),
key = "${mq.config.queue.info.routing.key}"
)
)
public class InfoConsumer {
类名前设置这些参数,就为消费者指定了一个交换器, 指定了一个队列和路由键。消费者在监听队列时,就是拿着这个路由键去找交换器,交换器通过拿到的路由键到指定队列里取数据。因为在direct中,路由键和队列时一对一的,所以消费者绑定的路由键只能到固定的队列里取数据。
TOPIC模式:
设置如下配置:
#设置交换器名称
mq.config.exchange.topic=log.topic
#info队列名称
mq.config.queue.info.topic=log.info2
#error队列名称
mq.config.queue.error.topic=log.error2
#log队列名称
mq.config.queue.log.topic=log.all
发送者如下配置:
//topic消息生产者 向多个队列发送消息
public void sendMsg4(String msg)
{
amqpTemplate.convertAndSend(exchageTopic , "user.log.error" , msg);
}
第一个消费者:
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${mq.config.queue.info.topic}" , autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange.topic}" , type = ExchangeTypes.TOPIC),
key = "*.log.error"
)
)
public class UserConsumer
第二个消费者:
@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${mq.config.queue.log.topic}" , autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange.topic}" , type = ExchangeTypes.TOPIC),
key = "*.log.*"
)
)
public class LogConsumer
对于生产者 , 生产者通过user.log.info2路由键向交换器发送了一条消息。 这时候交换器会将这个路由键和他关联的消息存起来。(这时候队列没有创建)
对于消费者 , 消费者通过模糊匹配的路由键,想交换器去索要发送者发来的信息。 这时候交换器就会根据之前生产者发来的路由和信息构成的路由表,去挨个匹配消费者拿来的路由键。
如果模糊匹配能匹配的上,那就把这个路由键所关联的信息拿出来,放到这个消费者所关联的队列中。如果队列此时不存在,则创建队列,然后将信息存入。
例如: 消费者A绑定的队列为log.infoA , 绑定的路由为*.log.info 。
消费者B绑定的队列为log.infoB, 绑定的路由为*.log.* 。
消费者C绑定的队列为log.infoC, 绑定的路哟为*.log.C
此时, 生产者向交换器发送一个路由为: user.log.info 的消息msg。
交换器拿到生产者发来的消息后,根据路由匹配规则来决定这个消息可以放到 哪些队列中。
现在交换器路由表中的路由有三个 , 分别是 A: *.log.info(队列log.infoA) B : *.log.*(队列log.infoB) C : *.log.C (队列log.infoC) 生产者发来信息的路由为user.log.info
经过匹配, 能够匹配的路由键是消费者A的*.log.info , 消费者B的 *.log.* , 不能匹配的是消费者C的*.log.C。
所以,交换器会将这条消息放入消费者A绑定的log.infoA队列和消费者B绑定的log.infoB队列。
消费者A和消费者B监听队列后,就可以从队列中取到数据了。
在这里,消费者就是一个标标准准的买家, 交换器就是中介所。 消费者告诉交换器,我就要个皮大衣,什么材质,什么颜色。 生产者给交换器供货后,交换器就看生产者供的货是不是消费者想要的(能不能按匹配规则匹配上),如果可以,通知消费者来取货。