RabbitMQ学习总结 第五篇:路由Routing
- 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相关推荐
- RabbitMQ学习系列(五):routing路由模式和Topic主题模式
(一)routing路由模式 在前面一篇博客中讲到了exchange的类型,其中direct类型的exchange就是用于routing路由模式.direct类型的交换机是指:交换机和队列绑定时会设置 ...
- 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)
转:https://blog.csdn.net/forezp/article/details/69939114 最新版本: 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)( ...
- RabbitMQ学习笔记(高级篇)
RabbitMQ学习笔记(高级篇) 文章目录 RabbitMQ学习笔记(高级篇) RabbitMQ的高级特性 消息的可靠投递 生产者确认 -- confirm确认模式 生产者确认 -- return确 ...
- python学习[第十五篇] 文件系统
python学习[第十五篇] 文件系统 对文件系统访问大多数都通过os模块实现. os 模块文件/目录访问函数 文件处理 mkfifo() 创建命名通道只用于linux remove(path)/un ...
- Android学习笔记第五篇--网络连接与云服务(一)
Android学习笔记第五篇–网络连接与云服务 第一章.无线连接设备 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相 ...
- 【SpringCloud】第五篇: 路由网关(zuul)
前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...
- 第五篇:路由网关(zuul) zuul路由 服务过滤 (Finchley版本)V2.0_dev
前言: 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring C ...
- RabbitMQ学习系列(五): RPC 远程过程调用
前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...
- c语言cis,c语言小白学习历程第五篇
学习目标: 难的咱也看不懂,先把简单的看了再说,加油L 冲冲冲! 学习时间: 2020年11月1日 学习产出: 回调函数学习: 回调函数说白了就是一个通过函数指针调用的函数.如果你把函数的指针Call ...
- MySQL学习【第五篇SQL语句上】
一.mysql命令 1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql ...
最新文章
- HTTPS网络加密双向验证-使用AFNetworking封装
- 冬季生存法则,不得不看!
- SAP系统未清账和已清账的区分
- mysql error 1449_MySql错误:ERROR 1449 (HY000)
- swap,交换,第三随笔
- C++ 推断进程是否存在
- JZOJ 1667【AHOI2009】中国象棋——dp
- caffe将图像数据转换成lmdb文件
- Spring里用到了哪些设计模式
- jmeter安装配置教程
- matlab收益率,债券价格与收益率的Matlab实现(10页)-原创力文档
- VC6.0的兼容性问题解决方案
- python数据分析新手入门课程学习——(五)特征工程概述(数据预处理)(来源:慕课网)
- 客户端到服务器端的通信过程及原理
- rⅰd的意思_自动挡车上的P、R、N、D、L代表什么意思?老司机也搞晕了!
- 安装 FreeBSD-13.0-RELEASE-amd64
- 虚拟拨号服务器名称,怎么设置虚拟拨号服务器
- 7-25自习学习日记
- VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁
- 多元统计分析——各类图的具体应用(数据可视化)