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消費掉了