上一章节,咱们说了两个类型,本章咱们说一下其三:Topic Exchange网站
Topic Exchange spa
Topic Exchange – 将路由键和某模式进行匹配。此时队列须要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配很少很多一个词。所以“audit.#”可以匹配到“audit.irs.corporate”,可是“audit.*” 只会匹配到“audit.irs”。我在RedHat的朋友作了一张不错的图,来代表topic交换机是如何工做的: code
情景进入blog
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(); } } } }
效果图路由