博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ Topic exchange
阅读量:6843 次
发布时间:2019-06-26

本文共 2349 字,大约阅读时间需要 7 分钟。

 

Topic exchange

topic与之前的每个类型都不同(ps:废话每个都是不同的)。Topic解决了我们另一个需求。举个例子,有一个做资讯的公司,他们会收集各种科技公司的动态并且第一时间转发出来。小编A负责微软公司,小编B负责谷歌公司,手工去搜索文章并且看标题是否匹配再进行转发是非常的低效的,可能小编们想要偷懒,写一个程序去各大网站进行爬数据,对于标题中含有微软的交给小编A,对于标题中含有谷歌的交给小编B。

是的,topic就是类似与正则进行模糊匹配routingkey,对于key需求是即确定又不完全确定的。

*代表零到多个字符

. 代表一个字符

把这个嵌套到代码中,先看生产者部分代码,现在发布不再是写死的,可以在控制台程序中输入的。

var flag = true;            while (flag)            {                Console.WriteLine("请输入要发布的消息 key|msg。 或者按Ctrl+ C退出");                var msg = Console.ReadLine();                //创建返回一个新的频道                using (var channel = RabbitMqHelper.GetConnection().CreateModel())                {                    var msgs = msg.Split('|');                    //发布一个消息                    var body = Encoding.UTF8.GetBytes(msgs[1]);                    channel.BasicPublish("TopicExchange", routingKey: msgs[0], basicProperties: null, body: body);                    Console.Write("发布成功!");                }            }

再把注意力转到consumer端,可以指定路由规则。声明了一个topic类型的exchange进行绑定。然后进行消费

bool flag = true;            var key = "";            while (flag)            {                Console.WriteLine("请输入路由正则  .代表一个字符 *代表零到多个字符");                key = Console.ReadLine();                if (string.IsNullOrWhiteSpace(key))                {                    Console.Write("请输入路由");                    continue;                }                else                    flag = false;            }            using (var channel = RabbitMqHelper.GetConnection().CreateModel())            {                //根据声明使用的队列                var QueueName = key + "Queue";                //声明交换机 headers模式                channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false);                channel.QueueDeclare(QueueName, true, false, false, null);                //进行绑定                channel.QueueBind(QueueName, "TopicExchange", key, null);                //创建consumbers                var consumer = new EventingBasicConsumer(channel);                consumer.Received += (sender, e) =>                {                    var msg = Encoding.UTF8.GetString(e.Body);                    Console.WriteLine($"{e.RoutingKey}:{msg}");                };                //进行消费                channel.BasicConsume(QueueName, true, consumer);                Console.ReadKey();            }

现在,让我们把程序跑起来,并指定了 *微软*与*谷歌*的路由

再发布几条匹配的消息

转载地址:http://cgbul.baihongyu.com/

你可能感兴趣的文章
前端面试之关于HTTP协议
查看>>
利用 Matplotlib 绘制数据图形(二)
查看>>
iOS概念攻坚之路(二):Runtime
查看>>
关于前端请求发送时间时而长时而短问题(stalled a lot)
查看>>
Python 工匠:编写条件分支代码的技巧
查看>>
记一次前端面试经历
查看>>
带你探索JUnit 5.4
查看>>
<暗时间> 时间, 不在于你拥有多少, 而在于你怎样使用
查看>>
Git的使用--如何将本地项目上传到Github
查看>>
单例 - iOS
查看>>
戛纳电影节百花齐放,中国明星衣着品味紧跟时尚前沿
查看>>
TensorFlowPlayground好玩的tensorflow入门神器
查看>>
mysql 存储emoji表情
查看>>
总结--Java思维脑图
查看>>
深入了解Flex布局
查看>>
10年测试总监经验分享,你与优秀工程师的距离!
查看>>
HBase(印象笔记)及DML操作
查看>>
最长公共前缀
查看>>
同是ZooKeeper,你和架构师的理解差在哪里?
查看>>
你的心情如何?镜头「读脸」读出你的心情与隐私之间
查看>>