> 文章列表 > RabbitMQ( 发布订阅模式 ==> DirectExchange)

RabbitMQ( 发布订阅模式 ==> DirectExchange)

RabbitMQ( 发布订阅模式 ==> DirectExchange)

本章目录:

  • 何为DirectExchange
  • DirectExchange具体使用

一、何为DirectExchange

在上一篇文章中,讲述了FanoutExchange,其中publish向交换机发送消息时,我们并没有指定routkingKey,如下图所示

我们看看官方文档

之前使用FanoutExchange的时候,我们忽略了routingkey

其实在做Binding(队列与交换机绑定)的时候,我们可以携带一个 routingkey

在使用fanoutExchange时,它只是无脑的向所有队列进行广播,不太灵活

而用directExchange时,我们可以再发送消息到交换机,时指定一个bindingkey,它只会向完全匹配bindingkey的队列发送消息

以下是模式图:

在这个图中,我们看到X(directExchange)绑定了两个queue,Q1绑定了orange,Q2绑定了black和green。

在这种模式下,发布routingKey为orange的消息到X后,该消息会被投递给Q1发布routingKey为black或者green的消息到X后,会被投递给Q2

我们为每个队列绑定相同的key,这样一来,发布routingKey为balck到X时,就达成了和Fanout一样的效果:广播 


二、 DirectExchange具体使用

在消费者服务中,编写两个方法分别监听qA和qB。

qA匹配的key:red,white 

qB匹配的key:red,yellow

    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "brrbaii.queueA"),exchange = @Exchange(name = "brrbaii.direct",type = ExchangeTypes.DIRECT),key = {"red","white"}))public void lA(String msg){System.out.println("queueA"+msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "brrbaii.queueB"),exchange = @Exchange(name = "brrbaii.direct",type = ExchangeTypes.DIRECT),key = {"red","yellow"}))public void lB(String msg){System.out.println("queueB"+msg);}

在publish内发布routingKey为yellow的消息到directExchange

观察监听结果

指定key为yellow的queueB接收到了消息,且完成消费

 

在publish内发布routingKey为red的消息到directExchange

 

 

两个队列都接收到了消息并且成功消费 ,验证了"我们为每个队列绑定相同的key,这样一来,发布routingKey为balck到X时,就达成了和Fanout一样的效果:广播 "


总结

Direct交换机与Fanout交换机的差异

  • Fanout交换机将消息路由给每一个与之绑定的队列 (广播)
  • Direct交换机根据RoutingKey判断路由给哪个队列
  • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似(广播)