RabbitMQ五种消息队列学习(五)--路由模式

来源:互联网 发布:lol欧服账号淘宝 编辑:程序博客网 时间:2024/06/08 17:23

RabbitMQ五种消息队列学习(五)–路由模式

标签(空格分隔): RabbitMQ


发布订阅模式只是利用路由这个功能,将消息全部分发给所有与路由绑定的队列中,不能对不同的消息进行选择性的分发。

模型结构

这里写图片描述

路由根据Routing Key进行动态的绑定分发
消息路径如下:
这里写图片描述

实现

1、生产者

发送一个key:channel.basicPublish(EXCHANGE_NAME, “delete”, null, message.getBytes());

  private final static String EXCHANGE_NAME = "test_exchange_direct";    public static void main(String[] argv) throws Exception {        // 获取到连接以及mq通道        Connection connection = ConnectionUtil.getConnection();        Channel channel = connection.createChannel();        // 声明exchange        channel.exchangeDeclare(EXCHANGE_NAME, "direct");        // 消息内容        String message = "id = 1000";        channel.basicPublish(EXCHANGE_NAME, "delete", null, message.getBytes());        System.out.println(" [x] Sent '" + message + "'");        channel.close();        connection.close();    }

2、消费者1
绑定路由key

// 绑定队列到交换机
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, “update”);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, “delete”);

 private final static String QUEUE_NAME = "test_queue_direct_1";    private final static String EXCHANGE_NAME = "test_exchange_direct";    public static void main(String[] argv) throws Exception {        // 获取到连接以及mq通道        Connection connection = ConnectionUtil.getConnection();        Channel channel = connection.createChannel();        // 声明队列        channel.queueDeclare(QUEUE_NAME, false, false, false, null);        // 绑定队列到交换机        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "delete");        // 同一时刻服务器只会发一条消息给消费者        channel.basicQos(1);        // 定义队列的消费者        QueueingConsumer consumer = new QueueingConsumer(channel);        // 监听队列,手动返回完成        channel.basicConsume(QUEUE_NAME, false, consumer);        // 获取消息        while (true) {            QueueingConsumer.Delivery delivery = consumer.nextDelivery();            String message = new String(delivery.getBody());            System.out.println(" [x] Received '" + message + "'");            Thread.sleep(10);            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);        }    }

3、消费者2

  private final static String QUEUE_NAME = "test_queue_direct_2";    private final static String EXCHANGE_NAME = "test_exchange_direct";    public static void main(String[] argv) throws Exception {        // 获取到连接以及mq通道        Connection connection = ConnectionUtil.getConnection();        Channel channel = connection.createChannel();        // 声明队列        channel.queueDeclare(QUEUE_NAME, false, false, false, null);        // 绑定队列到交换机        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "insert");        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "delete");        // 同一时刻服务器只会发一条消息给消费者        channel.basicQos(1);        // 定义队列的消费者        QueueingConsumer consumer = new QueueingConsumer(channel);        // 监听队列,手动返回完成        channel.basicConsume(QUEUE_NAME, false, consumer);        // 获取消息        while (true) {            QueueingConsumer.Delivery delivery = consumer.nextDelivery();            String message = new String(delivery.getBody());            System.out.println(" [x] Received '" + message + "'");            Thread.sleep(10);            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);        }    }

测试

总结:

该模式可以实现对绑定在同一个路由器的地方实现不同的分发模式。那有没有更灵活的处理方式呢?—通配符

阅读全文
0 0
原创粉丝点击