RabbitMQ Topic exchange


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();

            }

現在,讓我們把程序跑起來,並指定了 *微軟*與*谷歌*的路由

image

再發布幾條匹配的消息

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM