在上一篇博客中,我们详细的介绍了广播模型,在Fanout模式中,一条消息会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange(交换机)。
在Direct模型下
- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
- 消息的发送方在向Exchange发送消息时,也必须指定消息的RoutingKey
- Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的RoutingKey与消息的RoutingKey完全一致,才会接收到消息
如下图所示:
图解:
- P:生产者,向Exchange发送消息,发送消息时,会指定一个routingKey
- X: Exchange(交换机),接收生产者的消息,然后把消息递交给与routingkey完全匹配的队列
- C1:消息者,其所在队列指定了需要routing key为error的消息
- C2:消费者,其所在队列指定了需要routing key为info、error、warning的消息
代码实现
1.定义生产者
public class Provider {
public static void main(String[] args) throws IOException {
//获取连接对象
Connection connection = RabbitMQUtils.getConnection();
//获取通道
Channel channel = connection.createChannel();
//将通道声明指定交换机
//参数1:交换机名称 参数2:交换机的类型 direct 路由类型
//没有交换机会创建一共名为logs的交换机
channel.exchangeDeclare("logs_direct","direct");
//路由Key
String routerKey = "info";
//发送消息
channel.basicPublish("lo