RabbitMQ学习笔记(五) Topic
更多的问题
Direct Exchange帮助我们解决了分类发布与订阅消息的问题,但是Direct Exchange的问题是,它所使用的routingKey是一个简单字符串,这决定了它只能按照一个条件进行分类。
比如RabbitMQ学习笔记(四)Routing中的列子,我们是按照新闻的类型分类的,分为game, sport, music。
如果game下面有ff7,ff8的子分类,sport下面有soccer, basketball的分类。现在我们要求消费者程序接收game下面ff7子类别的所有新闻,sport下面的soccer子类别的所有新闻 ,以及所有的music新闻,单单使用Direct Exchange不能帮助我们解决这个问题。
Topic Exchange
Topic Exchange和Direct Exchange的用法基本一样。
他们的区别是, Topic Exchange在指定routingKey的时候,必须使用一个单词列表,每个单词之间用”.”间隔, 例如game.ff7, sport.soccer, Topic Exchange使用的routingKey的最大长度是256字节。
而且在Topic Exchange的routingKey中可以使用2种通配符
- * 匹配任何一个单词, 例* 表示所有的游戏新闻,game.ff7, game.ff8可以匹配,但是game.ff7.music就不能匹配,因为只能匹配一个单词。
- # 匹配零个或多个单词# 表示也表示游戏所有的新闻,game.ff7,game.ff8可以匹配,game.ff7.music也可以匹配。
你甚至可以这样写*.*.rabbit,表示所有3级新闻类别兔子的新闻,zoo.grass.rabbit和zoo.cage.rabbit都可以匹配
修改代码
Send
- 使用Topic Exchange
- 发送消息需要指定新闻分类 ,命令格式“dotnet run [分类路径] [消息信息]”
static void Main(string[] args) { var messageType = args[0]; var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { channel.ExchangeDeclare("topicExchange", "topic"); string message = $"{args[0]} news: {args[1]}"; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "topicExchange", routingKey: messageType, basicProperties: null, body: body ); Console.WriteLine("[x] Sent {0}", message); } } }
Receive
- 使用Topic Exchange
- 启动程序时,需要设置希望订阅的新闻分类, 命令格式“dotnet run [新闻分类1] [新闻分类2] ….”
static void Main(string[] args) { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { channel.ExchangeDeclare("topicExchange", "topic"); var queueName = channel.QueueDeclare().QueueName; foreach (var type in args) { channel.QueueBind(queue: queueName, exchange: "topicExchange", routingKey: type); } var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine("[x] Received {0}", message); }; channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer); Console.Read(); } } }
最终效果
- 启动一个Send程序,2个Receive程序
- 一个Receive程序订阅ff7下面的所有新闻(包含ff7下面所有的子类别新闻),soccer下面的所有新闻(包含soccer下面的所有子类别新闻),music下的所有新闻(不包括子类别新闻)
- 一个Receive程序订阅ff8下面的所有新闻(包含ff8下面所有的子类别新闻),basketball下面的所有新闻(包含basketball下面的所有子类别新闻)。
RabbitMQ学习笔记(五) Topic的更多相关文章
- RabbitMQ学习笔记五:RabbitMQ之优先级消息队列
RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...
- rabbitMQ学习笔记(六) topic类型消息。
上一节中使用了消息路由,消费者可以选择性的接收消息. 但是这样还是不够灵活. 比如某个消费者要订阅娱乐新闻消息 . 包括新浪.网易.腾讯的娱乐新闻.那么消费者就需要绑定三次,分别绑定这三个网站的消息类 ...
- rabbitMQ学习笔记(五) 消息路由
生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉. 这时候就可以对消息进行过滤了. 在消费者端设置好需要接收的消息类型. 如果不使用默认的E ...
- openresty 学习笔记五:访问RabbitMQ消息队列
openresty 学习笔记五:访问RabbitMQ消息队列 之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节.这里是做具体实施,用lua访问Rab ...
- 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...
- 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群
在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
随机推荐
- Android进阶:一、日志打印和保存策略
前言: 项目开始没有做好日志统计工作,每次有问题后端都得找前端对接,严重影响工作效率.最近特地在项目中加上日志保存策略,在此分享,供需要的人学习. 一.更详细的日志信息 既然决定自定义一个log,那我 ...
- CF1013B And
There is an array with n elements a1, a2, ..., an and the number x. In one operation you can select ...
- poj1681 Network
题目链接 https://cn.vjudge.net/problem/17712/origin Andrew is working as system administrator and is pla ...
- hbase_1
常见的RDBMS:(数据库排行) ** mysql --开源[社区版] .收费[企业版] --市场占有率高.web领域被广泛使用 ** 2008年被oracle收购 ** mysql主从架构[集群的一 ...
- c++之STL容器删除元素
1.删除容器中特定值的元素 如果是容器vector,string,,deque,使用erase-remove 例如:erase-remove 注:因为container没有remove,contain ...
- 1.3 正则表达式和python语言-1.3.7 匹配任何单个字符
1.3.7 匹配任何单个字符 (2018-05-08) 点号(.)不能匹配一个换行符\n 或者非字符,也就是说,一个空字符串 搜索一个真正的句点(小数点), 而我们通过使用一个反斜线对句点的功能进行转 ...
- js合并table指定列
function MergeTableCell(tableId, startRow, endRow, col) { var tb = document.getElementById(tableId); ...
- Oracle ctl模版
将txt数据装载到数据库 数据无”” LOAD DATA CHARACTER-SET ZHS16GBK truncate into table a FIELDS TERMINATED BY ‘,’ T ...
- vs2012开发基于MFC的ActiveX控件
1.新建工程 2.一直点击下一步,直到出现一下界面,注意红色标注选项,点击完成. 3.进入工程的属性界面,设置工程属性 4.添加对话框资源及其他控件,添加对话框类, 5.设置对话框属性 6.设置Dia ...
- 记一次Dynamic Batching不生效的爬坑实例分析[Unity]
最近在项目开发过程中,无意发现游戏场景的绘制占用了大量的Batches,几乎一个模型显示就占用了一个Batch,而Saved by batching数量几乎为0,即没有任何合批渲染优化.这显然跟预期相 ...