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(); }
現在,讓我們把程序跑起來,並指定了 *微軟*與*谷歌*的路由
再發布幾條匹配的消息