有网站如何做直播,网络推广文案怎么写,郑州网站改版,佛山网站建设策划一、发布订阅-DirectExchange#xff08;路由模式#xff09; 在Fanout模式中#xff0c;一条消息#xff0c;会被所有订阅的队列都消费。但是#xff0c;在某些场景下#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 Direct Exchan…一、发布订阅-DirectExchange路由模式 在Fanout模式中一条消息会被所有订阅的队列都消费。但是在某些场景下我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 Direct Exchange 会将接收到的消息根据规则路由到指定queue因此称为路由模式(routes)。 - 每一个Queue都与Exchange设置一个BindingKey - 发布者发送消息时,指定消息的RoutingKey - Exchange将消息路由到BindingKey与消息RoutingKey一致的队列; - 一个Queue可以绑定多个BindingKey也就是说Direct Exchange可以模拟Fanout但是比Fanout灵活。 在Direct模型下
- 队列与交换机的绑定不能是任意绑定了而是要指定一个RoutingKey路由key - 消息的发送方在 向 Exchange发送消息时也必须指定消息的 RoutingKey。 - Exchange不再把消息交给每一个绑定的队列而是根据消息的Routing Key进行判断只有队列的Routingkey与消息的 Routing key完全一致才会接收到消息
二、DirectExchange演示案例
实现思路如下
1. 利用RabbitListener声明Exchange、Queue、RoutingKey(不使用bean声明,基于RabbitListener注解声明)
2. 在consumer服务中编写两个消费者方法分别监听direct.queue1和direct.queue2
3. 在publisher中编写测试方法向it. direct发送消息
具体步骤
步骤一
1.在consumer服务中编写两个消费者方法分别监听direct.queue1和direct.queue2
2.并利用RabbitListener声明Exchange、Queue、RoutingKey
RabbitListener(bindings QueueBinding(value Queue(name direct.queue1),exchange Exchange(name it.direct, type ExchangeTypes.DIRECT),key {red, blue}
))
public void listenDirectQueue1(String msg){System.out.println(消费者接收到direct.queue1的消息【 msg 】);
}RabbitListener(bindings QueueBinding(value Queue(name direct.queue2),exchange Exchange(name it.direct, type ExchangeTypes.DIRECT),key {red, yellow}
))
public void listenDirectQueue2(String msg){System.out.println(消费者接收到direct.queue2的消息【 msg 】);
} 步骤二在publisher服务的SpringAmqpTest类中添加测试方法向it. direct发送消息 Test
public void testSendDirectExchange() {// 交换机名称String exchangeName it.direct;// 消息String message hellored;// 发送消息rabbitTemplate.convertAndSend(exchangeName, red, message);
} Direct模式总结: Direct交换机与Fanout交换机的差异:
- Fanout交换机将消息路由给每一个与之绑定的队列 - Direct交换机根据RoutingKey判断路由给哪个队列 - 如果多个队列具有相同的RoutingKey则与Fanout功能类似
基于RabbitListener注解声明队列和交换机常见注解: Queue Exchange