一、Topic Exchange介绍

topic exchange和direct exchange类似,都是通过routing key和binding key进行匹配,不同的是topic exchange可以为routing key设置多重标准。

direct路由器类似于sql语句中的精确查询;topic 路由器有点类似于sql语句中的模糊查询。

还记得吗?我们在《RabbitMQ入门:发布/订阅(Publish/Subscribe)》中对exchange的分类进行过介绍:

Direct:完全根据key进行投递的,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。
Topic:对key进行模式匹配后进行投递,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。
Fanout:不需要key,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
Headers:我们可以不考虑它。

下面是官网给出的工作模型(P代表生产者,X代表exhange,红色的Q代表队列,C代表消费者):

我们来分析下这个模型。

它发送的消息是用来描述动物的。路由键有三个单词:<speed>.<color>.<species>,第一个单词描述了速度,第二个描述了颜色,第三个描述了物种。
有三个绑定键,Q1绑定键为*.orange.*(关注所有颜色为orange的动物); Q2的绑定键有两个,分别是*.*.rabbit(关注所有的兔子)和lazy.#(关注所有速度为lazy的动物)。

因此,路由键为quick.orange.rabbit的消息将发送到Q1和Q2,路由键为quick.orange.fox的消息将发送到Q1,路由键为lazy.brown.fox的消息将发送到Q2。路由键为lazy.pink.rabbit的消息将发送到Q2,但是注意,它只会到达Q2一次,尽管它匹配了两个绑定键。路由键为quick.brown.fox的消息因为不和任意的绑定键匹配,所以将会被丢弃。

如果有人手一抖发了个lazy.orange.male.rabbit这种四个单词的,这个怎么办呢? 由于它和lazy.#匹配,因此将发送到Q2。

二、代码示例

接下来我们看下代码

  1. 生产者

    public class LogTopicSender {// exchange名字public static String EXCHANGE_NAME = "topicExchange";public static void main(String[] args) {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = null;Channel channel = null;try {// 1.创建连接和通道connection = factory.newConnection();channel = connection.createChannel();// 2.为通道声明topic类型的exchange
                channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);// 3.发送消息到指定的exchange,队列指定为空,由exchange根据情况判断需要发送到哪些队列String routingKey = "info";
    //            String routingKey = "log4j.error";
    //            String routingKey = "logback.error";
    //            String routingKey = "log4j.warn";String msg = " hello rabbitmq, I am " + routingKey;channel.basicPublish(EXCHANGE_NAME, routingKey, null, msg.getBytes());System.out.println("product send a msg: " + msg);} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace();} finally {// 4.关闭连接if (connection != null) {try {connection.close();} catch (IOException e) {e.printStackTrace();}}}}
    }

  2. 消费者
    public class LogTopicReciver {public static void main(String[] args) {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = null;Channel channel = null;try {// 1.创建连接和通道connection = factory.newConnection();channel = connection.createChannel();// 2.为通道声明topic类型的exchange
                channel.exchangeDeclare(LogTopicSender.EXCHANGE_NAME, BuiltinExchangeType.TOPIC);// 3.创建随机名字的队列String queueName = channel.queueDeclare().getQueue();// 4.建立exchange和队列的绑定关系String[] bindingKeys = { "#" };
    //            String[] bindingKeys = { "log4j.*", "#.error" };
    //            String[] bindingKeys = { "*.error" };
    //            String[] bindingKeys = { "log4j.warn" };for (int i = 0; i < bindingKeys.length; i++) {channel.queueBind(queueName, LogTopicSender.EXCHANGE_NAME, bindingKeys[i]);System.out.println(" **** LogTopicReciver keep alive ,waiting for " + bindingKeys[i]);}// 5.通过回调生成消费者并进行监听Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,www.feifanyule.cn/ Envelope envelope,com.rabbitmq.client.AMQP.BasicProperties properties, byte[] body) throws IOException {// 获取消息内容然后处理String msg = new String(body, "UTF-8");System.out.println("*********** LogTopicReciver" + " get message :[" + msg + "]");}};// 6.消费消息channel.basicConsume(queueName, true, www.078881.cn  consumer);} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace(www.huachengj1980.com/);}}
    }

  3. 启动消费者,作为消费者1
  4. 分别将String[] bindingKeys = { "www.chaoyueyule.com" };改为String[] bindingKeys = { "log4j.*", "#.error" };/String[] bindingKeys = { "*.error" };/String[] bindingKeys = www.thqpt.com/ { "log4j.warn" };,然后启动作为消费者2、消费者3、消费者4
  5. 启动4次生产者,routing key分别为String routingKey = "info";、String routingKey =www.2018yulpt.com "log4j.error";、String routingKey = "logback.error";、String routingKey = "log4j.warn";
  6. 观察控制台log
    生产者:
    product send a msg:  hello rabbitmq, I am info
    product send a msg:  hello rabbitmq, I am log4j.error
    product send a msg:  hello rabbitmq, I am logback.error
    product send a msg:  hello rabbitmq, I am log4j.warn消费者1:**** LogTopicReciver keep alive ,waiting for #
    *********** LogTopicReciver get message :[ hello rabbitmq, I am info]
    *********** LogTopicReciver get message :[ hello rabbitmq, I am log4j.error]
    *********** LogTopicReciver get message :[ hello rabbitmq, I am logback.error]
    *********** LogTopicReciver get message :[ hello rabbitmq, I am log4j.warn]消费者2:**** LogTopicReciver keep alive ,waiting for log4j.***** LogTopicReciver keep alive ,waiting for #.error
    *********** LogTopicReciver get message :[ hello rabbitmq, I am log4j.error]*********** LogTopicReciver get message :[ hello rabbitmq, I am logback.error]
    *********** LogTopicReciver get message :[ hello rabbitmq, I am log4j.warn]消费者3:**** LogTopicReciver keep alive ,waiting for *.error
    *********** LogTopicReciver get message :[ hello rabbitmq, I am log4j.error]
    *********** LogTopicReciver get message :[ hello rabbitmq, I am logback.error]消费者4:**** LogTopicReciver keep alive ,waiting for log4j.warn
    *********** LogTopicReciver get message :[ hello rabbitmq, I am log4j.warn]

  7. 观察RabbitMQ管理页面

Topic Exchange介绍相关推荐

  1. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  2. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别

    这是direct exchange写法中消息发送写法,可见下图红色框中路由键是queue队列中定义的路由键 这是topic exchange写法中消息发送写法,可见下图红色框中路由键是exchange ...

  3. RabbitMQ Topic exchange

    Topic exchange topic与之前的每个类型都不同(ps:废话每个都是不同的).Topic解决了我们另一个需求.举个例子,有一个做资讯的公司,他们会收集各种科技公司的动态并且第一时间转发出 ...

  4. RabbitMq系列(九):主题交换Topic Exchange

    系列文章 RabbitMq系列(一):服务器搭建 RabbitMq系列(二):最简单的例子 RabbitMq系列(三):工作队列 RabbitMq系列(四):消息确认和持久性 RabbitMq系列(五 ...

  5. RabbitMQ交换器Exchange介绍与实践

    导读 有了Rabbit的基础知识之后(基础知识详见:深入解读RabbitMQ工作原理及简单使用),本章我们重点学习一下Rabbit里面的exchange(交换器)的知识. 交换器分类 RabbitMQ ...

  6. RabbitMq(七) Topic模式介绍及代码示例

    概述: 在上一文章中我们介绍了路由模式(Routing),routing模式是不同的消息队列绑定了不同的路由key,但是我们看出路由key为固定的字符串标记.而本章中的Topic模式则为在路由模式下, ...

  7. rabbitmq的通配符模式(Topic Exchange)的*和#区别

    符号"#"匹配路由键的一个或多个词,符号"*"匹配路由键的一个词. 例如: topic.#那么这个队列会会接收topic开头的消息 topic.*.queue那 ...

  8. ONNX(Open Neural Network Exchange)介绍

          开放神经网络交换(Open Neural Network Exchange, ONNX)是一种用于表示机器学习模型的开放标准文件格式,可用于存储训练好的模型,它使得不同的机器学习框架(如P ...

  9. RabbitMq的工作模式 介绍+测试代码,以及三种Exchange模式介绍.

    RabbitMq的提供了六种模式分别是:简单模式,工作模式,发布\订阅模式,路由模式,通配符模式,RPC远程调用模式 下面将详细介绍常用的前五种模式,附上测试代码. 公共的代码---连接工具类: pu ...

最新文章

  1. 展示动图_DNF:多GIF动图展示,暗夜使者个性武器幻化推荐
  2. Android应用性能优化之使用SparseArray替代HashMap(转)
  3. java 定义动态接口_使用自定义annotation接口进行aspectj动态缓存
  4. 微信小程序api接口调用用封装
  5. mqtt之C++编译
  6. C# 5.0 Async函数的提示和技巧
  7. Tomcat报错:The server does not support version 3.0 of the J2EE Web module specification
  8. Dynamics 365 Online-Unified User Interface
  9. pta c语言编程答案,PTA 程序设计 单选题-期末复习
  10. iframe背景透明的设置方法
  11. 电网计算机面试专业题,国家电网计算机管理员面试经验|面试题 - 职朋职业圈...
  12. emacs下安装eaf
  13. java 2分钟_Java怎么判断他是否在2分钟内执行了任务?
  14. 应用金数据在线订单功能 为中小企业带来真正价值
  15. 贵阳副市长刚写了一本区块链的书,趁热乎推荐给你!
  16. 运营App渠道推广中,如何统计推广效果?
  17. 计算机跨教育学,某985计算机专业,想要三跨北师大教育学,会不会很难?
  18. Windows10忘记Microsoft账户密码桌面登录进不去,不重装系统删除微软账户更改本地用户登录
  19. UE4 天气系统插件使用
  20. 一天一看————RAID磁盘阵列及配置

热门文章

  1. 【AWS入门】流量镜像
  2. linux搭建个人私有云存储系统nextcloud(记录操作全过程)
  3. 树莓派 轻触开关 按键使用
  4. Visaul Studio 2008(TeamSuit/Professional/Development/TFS/TestLoad)全系列下载链接
  5. Mac 安装 TensorFlow 2.7 环境,支持 AMD 显卡
  6. 2022年中国互联网广告行业市场规模及发展前景分析 2027年中国互联网广告规模或将接近9000亿元
  7. endnote怎么保存上次记录_endnote使用经验总结
  8. Word表格操作简历排版
  9. 从技术、服务到共创 声网Agora构建RTC生态
  10. WBTCITRIX上实现安装打印机的几种方法