1. 程式人生 > >RabbitMQ headers Exchange

RabbitMQ headers Exchange

declare 我們 end dict ber admin class log utf

RabbitMQ headers Exchange

Headers Exchange

headers也是一種交換機類型,但是在rabbitmq官網中的教程中並沒有說到。資料也很少,但是找一找總會有的。

headers與direct的模式不同,不是使用routingkey去做綁定。而是通過消息headers的鍵值對匹配

發布者 -- > headersexchange --> (user: “小明 ”) binding --> queue

也就是說 user: 小明 替代了之前的routingkey。在做綁定的時候有兩種匹配方式供選擇。x-match (all/any)

意思就是鍵值對中所有的項都要匹配與只要有一個匹配就可以。下面就可以動手寫代碼了

在生產消息的時候,我們往消息的headers中附加了user:admin,pwd:123456

技術分享
          //創建返回一個新的頻道
            using (var channel = RabbitMqHelper.GetConnection().CreateModel())
            {

                //創建properties
                var properties = channel.CreateBasicProperties();

                //往內容的headers中塞入值 
                properties.Headers = new Dictionary<string, object>()
                {
                    {"user","admin" },
                    {"pwd","123456" }
                };


                //發布一個消息
                var msg = Encoding.UTF8.GetBytes($"二狗子");

                channel.BasicPublish("headersExchange", routingKey: string.Empty, basicProperties: properties,body: msg);

                Console.Write("發布成功!");

            }

            Console.ReadKey();
技術分享

在consumer中,我們可以選擇創建兩種方式,any/all。綁定的時候我們放了一些匹配項在裏面,也就是如果 user:admin、pwd:123456 headers類型的exchange就可以把消息推到queue中

技術分享
            bool flag = true;
            string pattern = "";
            while (flag)
            {
                Console.WriteLine("請選擇headers匹配模式  1(any)/2(all)");
                pattern = Console.ReadLine();
                if (pattern == "1" || pattern == "2")
                    flag = false;
                else
                    Console.Write("請做出正確的選擇");
            }



            using (var channel = RabbitMqHelper.GetConnection().CreateModel())
            {
                //根據聲明使用的隊列
                var headersType = pattern == "1" ? "any" : "all";

                //聲明交換機 headers模式
                channel.ExchangeDeclare("headersExchange", ExchangeType.Headers, true, false);

                channel.QueueDeclare("headersQueue", true, false, false, null);
                //進行綁定
                channel.QueueBind("headersQueue", "headersExchange", string.Empty, new Dictionary<string, object>
                {
                    //第一個匹配格式 ,第二與第三個則是匹配項
                    { "x-match",headersType},
                    { "user","admin"},
                    { "pwd","123456"}
                });

                //創建consumbers
                var consumer = new EventingBasicConsumer(channel);

                consumer.Received += (sender, e) =>
                {
                    var msg = Encoding.UTF8.GetString(e.Body);

                    Console.WriteLine($"{msg}");
                };

                //進行消費
                channel.BasicConsume("headersQueue", true, consumer);

                Console.ReadKey();

            }
技術分享

這裏實驗一個all類型的,首先把consumer運行起來,第一次我們的生產者的headers中只一個項匹配,可以看到消息是發布出去了,但是consumer並沒有從queue中收到,也就是這邊是不匹配的 exchange並沒有把消息推到queue。

技術分享

在webui中也是可以看到queue中是沒有任何消息的

技術分享

這時再把生產者的headers中user也加上,現在是完全匹配的再發布一次消息,發布的消息被consumer消費掉了

技術分享

RabbitMQ headers Exchange