rabbitmq中对DIRECT和TOPIC路由的记录

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监听队列后,就可以从队列中取到数据了。

 

在这里,消费者就是一个标标准准的买家, 交换器就是中介所。 消费者告诉交换器,我就要个皮大衣,什么材质,什么颜色。 生产者给交换器供货后,交换器就看生产者供的货是不是消费者想要的(能不能按匹配规则匹配上),如果可以,通知消费者来取货。

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值