RabbitMQ入门学习系列(六) Exchange的Topic类型
快速阅读
介绍exchange的topic类型,和Direct类型相似,但是增加了"."和"#"的匹配。比Direct类型灵活
Topic消息类型
特点是:topic消息类型不能是任意的routing key, 必须是有点"."组成的单词列表。
和dirct类似,最后也是也相应的key进行匹配
例如:speed.color.sepcies
注意可以用*号和#号出现,和我们日常用的正则表达式含义相近
"*"号代表任意一个单词
"#"号代表0个或多个单词
生产者代码
- 创建连接和信道
- 声明exchange类型
- 设置两个routingkey 各自发送两次。一共发送四条消息
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "topicType", type: "topic");
var list = new List<string>();
list.Add("www.baidu.com");
list.Add("www.google.com");
for (var i = 0; i < 2; i++)
{
var routingKey = list[0];
string message = "Hello World!this message routingkey is " + routingKey;
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: "topicType",
routingKey: routingKey,
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0},id={1}", message,i);
Thread.Sleep(1000);
}
for (var i = 0; i < 2; i++)
{
var routingKey = list[1];
string message = "Hello World!this message routingkey is " + routingKey;
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: "topicType",
routingKey: routingKey,
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0},id={1}", message, i);
Thread.Sleep(1000);
}
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
消费者代码
- 创建连接和信道
- 为了测试 topic 类型,限制输入中含 有baidu,google两个关键词和发送的routing key相匹配。
- 声明交换器类型
- 队列声明
- 把exchange和队列绑定到信道上
- 接受消息
static void Main(string[] args)
{
bool flag = true;
string level = "";
while (flag)
{
Console.WriteLine("请选择要查看的消息类型");
level = Console.ReadLine();
if (level.IndexOf(".baidu.")>0 || level.IndexOf(".google.") > 0 )
flag = false;
else
Console.Write("不支持你输入的消息");
}
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "topicType", type: "topic");
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: "topicType", routingKey: level);
//以下是区别生产者的
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (sender, e) =>
{
var body = e.Body;
var message = Encoding.UTF8.GetString(body);
var rk = e.RoutingKey;
Console.WriteLine("Received {0},routingKey:{1}", message, rk);
Thread.Sleep(3000);//模拟耗时任务 ,
Console.WriteLine("Received over");
channel.BasicAck(deliveryTag: e.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
Console.WriteLine("");
Console.ReadLine();
}
}
测试结果
我们启动消费者以后,输入四个routingkey去测试
分别是
.google.#, #.google. , *.google.com, *.baidu.com
分别监听中间是google 或者baidu的消息
结果符合要求

RabbitMQ入门学习系列(六) Exchange的Topic类型的更多相关文章
- RabbitMQ入门学习系列(五) Exchange的Direct类型
快速阅读 利用Exchange的Direct类型,实现对队列的过滤,消费者启动以后,输入相应的key值,攻取该key值对应的在队列中的消息 . 从一节知道Exchange有四种类型 Direct,To ...
- RabbitMQ入门学习系列(二),单生产者消费者
友情提示 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题.可以直接在公众号<爱码农爱生活 >留言.必定会再次 ...
- RabbitMQ入门学习系列(四) 发布订阅模式
发布订阅模式 什么时发布订阅模式 把消息发送给多个订阅者.也就是有多个消费端都完整的接收生产者的消息 换句话说 把消息广播给多个消费者 消息模型的核心 RabbitMQ不发送消息给队列,生产者也不知道 ...
- RabbitMQ入门学习系列(七) 远程调用RPC
快速阅读 生产者和消费者启动以后,都有一个接收事件,消费者是接收事件是处理调用方法以后等待生产者的返回,生产者的接收事件是处理接收生产者发送的消息,进行处理.消费者发送的时候要在回调队列中加入一个标识 ...
- RabbitMQ学习总结 第六篇:Topic类型的exchange
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- Bootstrap3.0入门学习系列
Bootstrap3.0入门学习系列规划[持续更新] 前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中, ...
- RabbitMQ入门教程(十六):RabbitMQ与Spring集成
原文:RabbitMQ入门教程(十六):RabbitMQ与Spring集成 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...
- Asp.Net MVC5入门学习系列③
原文:Asp.Net MVC5入门学习系列③ 添加一个视图(View) 接着上篇的入门系列,上面解说添加一个简单Controller(控制器),这里我们简单的在来添加一个View(视图)来展示我们Co ...
- Asp.Net MVC5入门学习系列②
原文:Asp.Net MVC5入门学习系列② 添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用 ...
随机推荐
- MySQL Backup--Xtrabackup备份常见错误
1.DDL操作与Xtrabackup备份冲突 当MySQL使用xrabckup进行备份时,如果执行DDL进行表修改,会导致xrabckup备份失败. 错误类似于: InnoDB: Last flush ...
- Linux命令cut
原文 cut 文件内容查看 显示行中的指定部分,删除文件中指定字段 显示文件的内容,类似于下的type命令. 说明 该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指明的文件,将 ...
- [daily][tmux] tmux常用快捷键
介绍 什么是tmux? Terminal Multiplexer. 1. 如果你是linux用户,tmux就是screen的alternative. 2. 如果你是windows用户,tmux就是一个 ...
- XML DOM 知识点
第一部分[DOM基础] DOM介绍: 1.什么是 HTML DOM? HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法(接口). 2.什么是 XML DOM? XML DO ...
- InteiiJ IDEA中如何制定制定哪一个配置文件
项目下有好些application.property文件 彼此之间也不是什么 从application.property中指定dev就去对应dev的关系 就想用我本地的数据库 于是添加了一个appl ...
- Codeforces C. A Simple Task(状态压缩dp)
题目描述: A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- linux系统编程之信号(五)
今天继续对信号进行学习,开始正入正题: sigaction函数: 安装信号之前我们已经学过一个函数:signal,它最早是在unix上出现的,它是对不可靠信号进行安装的,之后出现了可靠信号和实时信号, ...
- 用 Python 加密文件
生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而 ...
- 结构型模式(六) 享元模式(Flyweight)
一.动机(Motivate) 在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价--主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同时,让外 ...
- go条件变量同步机制
sync.Cond代表条件变量,需要配置锁才能有用 package main import ( "fmt" "runtime" "sync" ...