快速阅读

介绍exchange的topic类型,和Direct类型相似,但是增加了"."和"#"的匹配。比Direct类型灵活

Topic消息类型

特点是:topic消息类型不能是任意的routing key, 必须是有点"."组成的单词列表。

和dirct类似,最后也是也相应的key进行匹配

例如:speed.color.sepcies

注意可以用*号和#号出现,和我们日常用的正则表达式含义相近

"*"号代表任意一个单词

"#"号代表0个或多个单词

生产者代码

  1. 创建连接和信道
  2. 声明exchange类型
  3. 设置两个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();
}

消费者代码

  1. 创建连接和信道
  2. 为了测试 topic 类型,限制输入中含 有baidu,google两个关键词和发送的routing key相匹配。
  3. 声明交换器类型
  4. 队列声明
  5. 把exchange和队列绑定到信道上
  6. 接受消息
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类型的更多相关文章

  1. RabbitMQ入门学习系列(五) Exchange的Direct类型

    快速阅读 利用Exchange的Direct类型,实现对队列的过滤,消费者启动以后,输入相应的key值,攻取该key值对应的在队列中的消息 . 从一节知道Exchange有四种类型 Direct,To ...

  2. RabbitMQ入门学习系列(二),单生产者消费者

    友情提示 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题.可以直接在公众号<爱码农爱生活 >留言.必定会再次 ...

  3. RabbitMQ入门学习系列(四) 发布订阅模式

    发布订阅模式 什么时发布订阅模式 把消息发送给多个订阅者.也就是有多个消费端都完整的接收生产者的消息 换句话说 把消息广播给多个消费者 消息模型的核心 RabbitMQ不发送消息给队列,生产者也不知道 ...

  4. RabbitMQ入门学习系列(七) 远程调用RPC

    快速阅读 生产者和消费者启动以后,都有一个接收事件,消费者是接收事件是处理调用方法以后等待生产者的返回,生产者的接收事件是处理接收生产者发送的消息,进行处理.消费者发送的时候要在回调队列中加入一个标识 ...

  5. RabbitMQ学习总结 第六篇:Topic类型的exchange

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  6. Bootstrap3.0入门学习系列

    Bootstrap3.0入门学习系列规划[持续更新]   前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中, ...

  7. RabbitMQ入门教程(十六):RabbitMQ与Spring集成

    原文:RabbitMQ入门教程(十六):RabbitMQ与Spring集成 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  8. Asp.Net MVC5入门学习系列③

    原文:Asp.Net MVC5入门学习系列③ 添加一个视图(View) 接着上篇的入门系列,上面解说添加一个简单Controller(控制器),这里我们简单的在来添加一个View(视图)来展示我们Co ...

  9. Asp.Net MVC5入门学习系列②

    原文:Asp.Net MVC5入门学习系列② 添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用 ...

随机推荐

  1. vue标签内循环数据逗号分隔

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. JS中BOM和DOM常用的事件

    总结:window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开新 ...

  3. Oracle 用户模式

    在 Oracle 数据库中,为了便于管理用户所创建的数据库对象(数据表.索引.视图等),引入了模式的概念,这样某个用户所创建的数据库对象就都属于该用户模式. 一.模式与模式对象 模式是一个数据库对象的 ...

  4. es5中变量提升的问题

    <script> //变量提升的问题 var tem=new Date(); //函数f 输出tem var命令会发生“变量提升”现象 //局部变量优先高于全局变量 var tem=&qu ...

  5. MySQL Index--InnoDB引擎的主键索引

    查看表主键信息 ## 查看表主键信息 SELECT t.TABLE_NAME, t.CONSTRAINT_TYPE, c.COLUMN_NAME, c.ORDINAL_POSITION FROM IN ...

  6. 191010 python3分解质因数

    # 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5.# 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:# (1)如果这个质数恰等于n,则说明分解 ...

  7. python高级特性-迭代

    概述 for  v   in d.values(): for k,v  in d.items(): for  a    in 'adfa': #判断对象是否可迭代 from collections i ...

  8. 《AlwaysRun!》第七次作业:团队项目设计完善&编码

    项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwnu-daizh/   这个作业的要求在哪里 https://www.cnblogs.com/nwnu-da ...

  9. 《BUG创造队》作业9:【Beta】冲刺 Scrum meeting 2

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 BUG创造队 作业学习目标 (1)掌握软件黑盒测试技术:(2)学 ...

  10. IDEA使用入门设置(从入门到放弃)

      激活 1:设置JDK路径 2:设置maven环境 3:设置tomcat 4:设置快捷键与eclipse相同 4.1:设置字体大小 5:创建maven  java 工程并进行编译打包等操作 6:创建 ...