• Q1对所有橘色的(orange)的动物感兴趣;
  • Q2希望能拿到所有兔子的(rabbit)信息,还有比较懒惰的(lazy.#)动物信息。

一条以” quick.orange.rabbit”为routing key的消息将会推送到Q1和Q2两个queue上,routing key为“lazy.orange.elephant”的消息同样会被推送到Q1和Q2上。但如果routing key为”quick.orange.fox”的话,消息只会被推送到Q1上;routing key为”lazy.brown.fox”的消息会被推送到Q2上,routing key为"lazy.pink.rabbit”的消息也会被推送到Q2上,但同一条消息只会被推送到Q2上一次。

如果在发送消息时所指定的exchange和routing key在消费者端没有对应的exchange和binding key与之绑定的话,那么这条消息将会被丢弃掉。例如:"orange"和"quick.orange.male.rabbit"。但是routing为”lazy.orange.male.rabbit”的消息,将会被推到Q2上。

Topic类型的exchange

Topic类型的exchange是很强大的,也可以实现其它类型的exchange。

  • 当一个队列被绑定为binding key为”#”时,它将会接收所有的消息,此时和fanout类型的exchange很像。
  • 当binding key不包含”*”和”#”时,这时候就很像direct类型的exchange。

2、最终实现

我们准备在日志系统中使用topic类型的exchange。开始我们准备routing keys使用两个单词:"<facility>.<severity>"。代码和上篇博文里的差不多,EmitLogTopic.java:

public class EmitLogTopic {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] argv)throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();//指定一个topic类型的exchangechannel.exchangeDeclare(EXCHANGE_NAME, "topic");//这里拿到routing keyString routingKey = getRouting(argv);String message = getMessage(argv);channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes());System.out.println(" [x] Sent '" + routingKey + "':'" + message + "'");connection.close();}//...
}

ReceiveLogsTopic.java的代码:

public class ReceiveLogsTopic {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] argv)throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();//指定一个topic类型的exchangechannel.exchangeDeclare(EXCHANGE_NAME, "topic");String queueName = channel.queueDeclare().getQueue();if (argv.length < 1){System.err.println("Usage: ReceiveLogsTopic [binding_key]...");System.exit(1);}//绑定binding keyfor(String bindingKey : argv){channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);}System.out.println(" [*] Waiting for messages. To exit press CTRL+C");QueueingConsumer consumer = new QueueingConsumer(channel);channel.basicConsume(queueName, true, consumer);while (true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());String routingKey = delivery.getEnvelope().getRoutingKey();System.out.println(" [x] Received '" + routingKey + "':'" + message + "'");}}
}

运行情况如下:

3、总结

在上边的基础上,只是丰富了routing key和binding key的写法。

参考链接:http://www.rabbitmq.com/tutorials/tutorial-five-java.html

RabbitMQ学习总结 第五篇:路由Routing相关推荐

  1. RabbitMQ学习系列(五):routing路由模式和Topic主题模式

    (一)routing路由模式 在前面一篇博客中讲到了exchange的类型,其中direct类型的exchange就是用于routing路由模式.direct类型的交换机是指:交换机和队列绑定时会设置 ...

  2. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

    转:https://blog.csdn.net/forezp/article/details/69939114 最新版本: 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)( ...

  3. RabbitMQ学习笔记(高级篇)

    RabbitMQ学习笔记(高级篇) 文章目录 RabbitMQ学习笔记(高级篇) RabbitMQ的高级特性 消息的可靠投递 生产者确认 -- confirm确认模式 生产者确认 -- return确 ...

  4. python学习[第十五篇] 文件系统

    python学习[第十五篇] 文件系统 对文件系统访问大多数都通过os模块实现. os 模块文件/目录访问函数 文件处理 mkfifo() 创建命名通道只用于linux remove(path)/un ...

  5. Android学习笔记第五篇--网络连接与云服务(一)

    Android学习笔记第五篇–网络连接与云服务 第一章.无线连接设备 ​ 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相 ...

  6. 【SpringCloud】第五篇: 路由网关(zuul)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  7. 第五篇:路由网关(zuul) zuul路由 服务过滤 (Finchley版本)V2.0_dev

    前言: 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring C ...

  8. RabbitMQ学习系列(五): RPC 远程过程调用

    前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...

  9. c语言cis,c语言小白学习历程第五篇

    学习目标: 难的咱也看不懂,先把简单的看了再说,加油L 冲冲冲! 学习时间: 2020年11月1日 学习产出: 回调函数学习: 回调函数说白了就是一个通过函数指针调用的函数.如果你把函数的指针Call ...

  10. MySQL学习【第五篇SQL语句上】

    一.mysql命令 1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql ...

最新文章

  1. HTTPS网络加密双向验证-使用AFNetworking封装
  2. 冬季生存法则,不得不看!
  3. SAP系统未清账和已清账的区分
  4. mysql error 1449_MySql错误:ERROR 1449 (HY000)
  5. swap,交换,第三随笔
  6. C++ 推断进程是否存在
  7. JZOJ 1667【AHOI2009】中国象棋——dp
  8. caffe将图像数据转换成lmdb文件
  9. Spring里用到了哪些设计模式
  10. jmeter安装配置教程
  11. matlab收益率,债券价格与收益率的Matlab实现(10页)-原创力文档
  12. VC6.0的兼容性问题解决方案
  13. python数据分析新手入门课程学习——(五)特征工程概述(数据预处理)(来源:慕课网)
  14. 客户端到服务器端的通信过程及原理
  15. rⅰd的意思_自动挡车上的P、R、N、D、L代表什么意思?老司机也搞晕了!
  16. 安装 FreeBSD-13.0-RELEASE-amd64
  17. 虚拟拨号服务器名称,怎么设置虚拟拨号服务器
  18. 7-25自习学习日记
  19. VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁
  20. 多元统计分析——各类图的具体应用(数据可视化)

热门文章

  1. 18.2.28阿里前端实习生内推面补坑
  2. 自定义吐司Toast小进阶
  3. 从技术雷达看持续交付
  4. httpclient4.3+jsoup模拟登陆河北移动
  5. 中国网站备案制度——祸国殃民
  6. Cisco实例1—构建高可用性DM×××网络2—方案设计
  7. Wheel ProgressBar 实现之三——模拟进度过程
  8. 云计算里AWS和Azure的探究(3)
  9. linux压缩和备份工具
  10. oracle游标特点,oracle游标应用 sys_refcursor 和 cursor比较