RabbitMQ八:交换机类型Exchange Types--Topic介绍
2017-08-15 16:35 小白admin 阅读(1773) 评论(0) 编辑 收藏 举报前言
上一章节,我们说了两个类型,本章我们说一下其三:Topic Exchange
Topic Exchange
Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。我在RedHat的朋友做了一张不错的图,来表明topic交换机是如何工作的:
情景进入
Topic解决了我们另一个需求。举个例子,有一个做资讯的公司,他们会收集各种科技公司的动态并且第一时间转发出来。小编A负责小米公司,小编B负责华为公司,手工去搜索文章并且看标题是否匹配再进行转发是非常的低效的,可能小编们想要偷懒,写一个程序去各大网站进行爬数据,对于标题中含有小米的交给小编A,对于标题中含有华为的交给小编B。
代码块
发布者:
/// <summary> /// Topic实现 模拟场景: 对于标题中含有小米的交给小编A,对于标题中含有华为的交给小编B。 /// </summary> /// <param name="args"></param> static void Main(string[] args) { var flag = true; while (flag) { Console.WriteLine("请输入要发布的消息key|msg"); var msg = Console.ReadLine(); if (msg != null && msg != "") using (var channel = HelpConnection.GetConnection().CreateModel()) { channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false, null); var msgs = msg.Split('|'); var body = Encoding.UTF8.GetBytes(msgs[1]); Console.WriteLine("发布内容:键" + msgs[0]); Console.WriteLine("发布内容:值" + msgs[1]); channel.BasicPublish("TopicExchange", msgs[0], null, body); Console.WriteLine("发布成功"); } else { flag = true; } } Console.ReadKey(); }
消费端
/// <summary> /// Topic实现 模拟场景: 对于标题中含有小米的交给小编A,对于标题中含有华为的交给小编B。 /// </summary> /// <param name="args"></param> static void Main(string[] args) { bool flag = true; var key = ""; while (flag) { Console.WriteLine("请输入路由正则, .代表字符,*代表零到多个字符"); key = Console.ReadLine(); if (string.IsNullOrWhiteSpace(key)) { Console.Write("请输入路由"); flag = true; } else { // flag = false; using (var channel = HelpConnection.GetConnection().CreateModel()) { var queueName = key + "Queue"; channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false, null); channel.QueueDeclare(queueName, true, false, false, null); channel.QueueBind(queueName, "TopicExchange", key, null); var consumer = new EventingBasicConsumer(channel); consumer.Received += (mode, e) => { var body = Encoding.UTF8.GetString(e.Body); Console.WriteLine("显示内容:" + body); }; channel.BasicConsume(queueName, true, consumer); Console.ReadKey(); } } } }
效果图
- 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
- 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。