RabbitMQ(04)——RabbitMQ的Direct消息模型

RabbitMQ——RabbitMQ的Direct消息模型

在 Fanout 消息模型中,使用Fanout交换机,一条消息发出去后,会被交换机发送给所有订阅的队列,再被队列对应的消费者消费。但是,再某些情况下,我们希望不同的消息能被不同的队列消费。这时就要用到Direct消息模型的Direct交换机。

Direct消息模型结构图

在这里插入图片描述

P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。

X:Exchange(交换机),接收生产者的消息,然后把消息递交给与routing key完全匹配的队列.

C1:消费者,其所在队列指定了需要routing key为error的消息

C2:消费者,其所在队列指定了需要routing key为info、error、warning的消息

队列与交换机之间通过指定一个 RoutingKey(路由key)进行绑定

消息生产者在向 Exchange交换机发送消息时,也必须给消息指定一个RoutingKey(路由key)

Exchange交换机不再把消息发送给每一个绑定的队列,而是根据消息的RoutingKey进行判断,只有队列的RoutingKey和消息的RoutingKey一致,才能接收到消息。

1、Direct消息模型之发布者发布消息

消息生产者的开发

消息发送者发送消息时指定的routingKey为"info"

public class Provider {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectUtils.getConnection("121.199.53.150", 5672, "/ems", "ems", "ems");
        Channel channel = connection.createChannel();
        //将通道绑定到交换机上,参数一:交换机名称,如果没有,会自动创建,参数二:交换机类型 direct直连交换机
        channel.exchangeDeclare("logs_direct","direct");
        //定义RoutingKey
        String routingKey = "info";
        //发送消息
        channel.basicPublish("logs_direct",routingKey, null,("direct rabbitmq,routingKey: "+routingKey).getBytes());
        channel.close();
        connection.close();
    }
}

2、Direct消息模型之消费者消费消息

消息消费者的开发

ConsumerA:ConsumerA队列的指定的routingKey为 “info”,“error”,“warning”

public class ConsumerA {
    public static void main(String[] args) throws IOException {
        Connection connection = ConnectUtils.getConnection("121.199.53.150", 5672, "/ems", "ems", "ems");
        Channel channel = connection.createChannel();
        //声明与通道连接的交换机
        channel.exchangeDeclare("logs_direct","direct");
        //创建临时队列
        String queue = channel.queueDeclare().getQueue();
        //通道绑定队列和交换机
        channel.queueBind(queue,"logs_direct","info");
        channel.queueBind(queue,"logs_direct","error");
        channel.queueBind(queue,"logs_direct","warning");
        //消费消息
        channel.basicConsume(queue,true,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerA direct rabbitmq:" + new String(body)+ "routingKey:" + envelope.getRoutingKey());
            }
        });
    }
}

ConsumerB:ConsumerB队列的指定的routingKey为 “error”,

public class ConsumerB {
    public static void main(String[] args) throws IOException {
        Connection connection = ConnectUtils.getConnection("121.199.53.150", 5672, "/ems", "ems", "ems");
        Channel channel = connection.createChannel();
        //声明与通道连接的交换机
        channel.exchangeDeclare("logs_direct","direct");
        //创建临时队列
        String queue = channel.queueDeclare().getQueue();
        //通道绑定队列和交换机
        channel.queueBind(queue,"logs_direct","error");
        //消费消息
        channel.basicConsume(queue,true,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerB direct rabbitmq:" + new String(body)+ "routingKey:" + envelope.getRoutingKey());
            }
        });
    }
}

先执行两个消息消费者,监听队列中的消息,再执行消息生产者发送消息,查看控制台的输出信息:

此时只有ConsumerA能接受到消息,因为ConsumerA队列的routingKey和消息发送者发送消息时指定的routingKey相同,都是“info”

ConsumerA:

在这里插入图片描述

修改消息发送者发送消息时指定的routingKey为 “error”,再执行消息生产者发送消息,查看控制台的输出信息:

此时ConsumerA和ConsumerB都能接受到消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里顾—程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值