【中间件】MQ Rabbitmq 订阅、路由、通配符模式 笔记

原创 2018年04月17日 19:54:13

前言:
同前篇,个人笔记
正文:

订阅模式

订阅模式

生成者

private final static String EXCHANGE_NAME = "test_msg_exchagne";

    public static void main(String[] argv) throws Exception {
        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        // 声明exchange 交换机,没有队列绑定时消息丢失,指定交换机的类型:fanout路由的
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

        // 消息内容
        String message = "商品已经新增,id = 1000";
        channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");

        channel.close();
        connection.close();

    }

消费者

private final static String QUEUE_NAME = "test_queue_fanout_1";

    private final static String EXCHANGE_NAME = "test_exchange_fanout";

    public static void main(String[] argv) throws Exception {

        // 获取到连接以及mq通道
        ……
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");

        // 同一时刻服务器只会发一条消息给消费者
        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(" 消费者次一: '" + message + "'");
            Thread.sleep(10);

            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }
消费者二、
private final static String QUEUE_NAME = "test_queue_fanout_2";

    private final static String EXCHANGE_NAME = "test_exchange_fanout";

    public static void main(String[] argv) throws Exception {

        // 获取到连接以及mq通道
       ……
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");

        // 同一时刻服务器只会发一条消息给消费者
        // 定义队列的消费者
        // 监听队列,手动返回完成:手动模式

        // 获取消息
        while (true) {
            同上
        }
    }

路由模式:

key:根据key,选择性 接收消息,较订阅 多了key(绑定交换机时),消费者key不同其他同
路由模式

发送端:

先创建交换机,找不到交换机、报错
 private final static String EXCHANGE_NAME = "test_exchange_direct";

    public static void main(String[] argv) throws Exception {
        // 获取到连接以及mq通道
        ……
        // 声明exchange,指定交换机的类型:direct
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");

        // 消息内容
        String message = "delet, id = 1001";
        //第二个指定key:delete 、update更新、insert新增、
        channel.basicPublish(EXCHANGE_NAME, "delete", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");

        channel.close();
        connection.close();
    }

消费者

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通道
        ……
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 绑定队列到交换机 并指定对应的key
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");

        // 同一时刻服务器只会发一条消息给消费者
        ……
        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);

        // 获取消息
        while (true) {
    ……           
        }
    }
消费者二:可以有多个消费者的意思
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通道
        // 声明队列 
        // 绑定队列到交换机 并指定对应的key
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "insert");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "delete");
    ……
    }

topic通配符模式:

消费者的key灵活:可以使用通配符:#一个或多个词 * 一个词
topic通配符模式

生成者

private final static String EXCHANGE_NAME = "test_exchange_topic";

    public static void main(String[] argv) throws Exception {
        // 获取到连接以及mq通道
       ……
        // 声明exchange topic类型
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        // 消息内容
        String message = "删除商品,id = 1001";  
        channel.basicPublish(EXCHANGE_NAME, "item.delete", null, message.getBytes());
        ……    }

消费者1订阅:需求明确

 private final static String QUEUE_NAME = "test_queue_topic_1";

    private final static String EXCHANGE_NAME = "test_exchange_topic";

    public static void main(String[] argv) throws Exception {

        // 获取到连接以及mq通道
       ……
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

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

        // 同一时刻服务器只会发一条消息给消费者
        channel.basicQos(1);

        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);

        // 获取消息
        while (true) {
            ……
       }
    }
消费者二:
 // 绑定队列到交换机
 channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "item.#");

省略了好多代码,是吧?

版权声明:欢迎大家的阅读,注明出处便可转载;学习过程中的笔记,厚着脸皮选了原创 https://blog.csdn.net/ma15732625261/article/details/79979574

【RabbitMQ】三种Exchange模式——订阅、路由、通配符模式

前两篇博客介绍了两种队列模式,这篇博客介绍订阅、路由和通配符模式,之所以放在一起介绍,是因为这三种模式都是用了Exchange交换机,消息没有直接发送到队列,而是发送到了交换机,经过队列绑定交换机到达...
  • u013046597
  • u013046597
  • 2017-06-02 14:51:06
  • 2205

RabbitMQ五种消息队列学习(六)--通配符模式(路由类型:Topic)

RabbitMQ五种消息队列学习(六)–通配符模式(路由类型:Topic)标签(空格分隔): RabbitMQ正如上一篇文章中所描述的一种模式的升级,如果需要监听某个交换机的所有消息的话,可以通过消息...
  • lbr2008
  • lbr2008
  • 2017-12-18 09:55:40
  • 328

rabbitmq(6)路由模式

1、模型 路由模式为升级版的订阅模式,增加了消费者选择性接收消息的功能。 每个消费者可以绑定多个routingKey,生产者在发送消息时指定routingKey致使只有绑定了该routingKey...
  • sz85850597
  • sz85850597
  • 2018-03-25 16:37:09
  • 31

RabbitMQ下的生产消费者模式与订阅发布模式

生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信。本文在总结了RabbitMQ核心概念的基础上,以“数据接入”和“事件分发”两个场景来探讨如何实现生产...
  • zwgdft
  • zwgdft
  • 2016-12-11 16:58:34
  • 8945

RabbitMQ的消息路由基本讲解

RabbitMQ是AMQP(高级消息队列协议)协议的一种实现,RabbitMQ的基本讲解也就是围绕着AMQP协议的讲解。首先我们需要介绍的几个基本角色:消息代理(message brokers):大家...
  • qbian
  • qbian
  • 2017-04-10 22:48:56
  • 461

RabbitMQ的订阅和发布步骤详解

一、关于RabbitMQ搭建和基本概念这里不做介绍,下面给出实用的参考博客 RabbitMQ基础概念及详细介绍参考文档:http://blog.csdn.net/whycold/articl...
  • u013507760
  • u013507760
  • 2016-12-15 11:42:50
  • 1422

轻松搞定RabbitMQ(四)——发布/订阅

翻译地址:http://www.rabbitmq.com/tutorials/tutorial-three-java.html        在前面的教程中,我们创建了一个工作队列,都是假设一个任务只...
  • xiaoxian8023
  • xiaoxian8023
  • 2015-09-25 14:28:39
  • 8637

RabbitMQ消息分发模式----"Publish/Subscribe"发布/订阅模式

介绍 我们都是基于一个队列发送和接受消息。  前面讲的几种,不管是生产者端还是消费者端都必须知道一个指定的QueueName才能发送、获取消息。  而RabbitMQ消息模型的核心思想是生产者不会...
  • a491857321
  • a491857321
  • 2016-01-29 20:03:32
  • 3130

Rabbit mq订阅方式获取消息并可设置持久化

Rabbit 通过方式获取消息:订阅方式其实是向queue注册consumer,通过rpc向queue server发送注册consumer的消息,rabbitMQ Server在收到消息后,根据消息...
  • liyantianmin
  • liyantianmin
  • 2015-06-30 16:41:43
  • 1846
收藏助手
不良信息举报
您举报文章:【中间件】MQ Rabbitmq 订阅、路由、通配符模式 笔记
举报原因:
原因补充:

(最多只允许输入30个字)