1. 程式人生 > >RabbitMQ八:交換機類型Exchange Types--Topic介紹

RabbitMQ八:交換機類型Exchange Types--Topic介紹

args change http 場景 標題 png nec 模擬 string

前言

上一章節,我們說了兩個類型,本章我們說一下其三:Topic Exchange

Topic Exchange

Topic Exchange – 將路由鍵和某模式進行匹配。此時隊列需要綁定要一個模式上。符號“#”匹配一個或多個詞,符號“*”匹配不多不少一個詞。因此“audit.#”能夠匹配到“audit.irs.corporate”,但是“audit.*” 只會匹配到“audit.irs”。我在RedHat的朋友做了一張不錯的圖,來表明topic交換機是如何工作的:

技術分享

情景進入

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

效果圖

技術分享

  • 博主是利用讀書、參考、引用、抄襲、復制和粘貼等多種方式打造成自己的純鍍 24k 文章,請原諒博主成為一個無恥的文檔搬運工!
  • 小弟剛邁入博客編寫,文中如有不對,歡迎用板磚扶正,希望給你有所幫助。

RabbitMQ八:交換機類型Exchange Types--Topic介紹