上一章節,咱們說了兩個類型,本章咱們說一下其三: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(); } } } }
效果圖路由