C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布
Fanout交換機(jī)模型
扇形交換機(jī),采用廣播模式,根據(jù)綁定的交換機(jī),路由到與之對(duì)應(yīng)的所有隊(duì)列。一個(gè)發(fā)送到交換機(jī)的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換機(jī)綁定的所有隊(duì)列上。很像子網(wǎng)廣播,每臺(tái)子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息。Fanout交換機(jī)轉(zhuǎn)發(fā)消息是最快的。
RabbitMQ控制臺(tái)操作
新增兩個(gè)隊(duì)列
在同一個(gè)Virtual host下新增兩個(gè)隊(duì)列Q1,Q2,如下圖所示:
綁定fanout交換機(jī)
將兩個(gè)隊(duì)列綁定到系統(tǒng)默認(rèn)的fanout交換機(jī),如下所示:
示例效果圖
生產(chǎn)者,采用Fanout類(lèi)型交換機(jī)發(fā)布消息,如下圖所示:
當(dāng)生產(chǎn)者發(fā)布 一條消息時(shí),Q1,Q2兩個(gè)隊(duì)列均會(huì)收到,如下圖所示:
當(dāng)啟動(dòng)消費(fèi)者后,兩個(gè)消費(fèi)者,均會(huì)訂閱到相關(guān)消息,如下圖所示:
核心代碼
消息發(fā)布
建立連接后,將通道聲明類(lèi)型為Fanout的交換機(jī),如下所示:
/// <summary> /// fanout類(lèi)型交換機(jī),發(fā)送消息 /// </summary> public class RabbitMqFanoutSendHelper : RabbitMqHelper { /// <summary> /// 發(fā)送消息 /// </summary> /// <param name="msg"></param> /// <returns></returns> public bool SendMsg(string msg) { try { using (var conn = GetConnection("/Alan.hsiang")) { using (var channel = conn.CreateModel()) { channel.ExchangeDeclare(exchange: "amq.fanout", type: ExchangeType.Fanout,durable:true); var body = Encoding.UTF8.GetBytes(msg); channel.BasicPublish(exchange: "amq.fanout", routingKey: "", basicProperties: null, body: body); //Console.WriteLine(" [x] Sent {0}", message); }; }; return true; } catch (Exception ex) { throw ex; } } }
消息訂閱
建立連接后,通道聲明類(lèi)型為Fanout的交換機(jī),并綁定隊(duì)列進(jìn)行訂閱,如下所示:
/// <summary> /// 扇形交換機(jī)接收消息 /// </summary> public class RabbitMqFanoutReceiveHelper : RabbitMqHelper { public RabbitMqReceiveEventHandler OnReceiveEvent; private IConnection conn; private IModel channel; private EventingBasicConsumer consumer; public bool StartReceiveMsg(string queueName) { try { conn = GetConnection("/Alan.hsiang"); channel = conn.CreateModel(); channel.ExchangeDeclare(exchange: "amq.fanout", type: ExchangeType.Fanout,durable:true); //此處隨機(jī)取出交換機(jī)下的隊(duì)列 //var queueName = channel.QueueDeclare().QueueName; channel.QueueBind(queue: queueName, exchange: "amq.fanout", routingKey: ""); consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); //Console.WriteLine(" [x] Received {0}", message); if (OnReceiveEvent != null) { OnReceiveEvent(queueName+"::"+message); } }; channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer); return true; } catch (Exception ex) { throw ex; } } }
作者:Alan.hsiang
出處:http://www.cnblogs.com/hsiang/
以上就是C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布的詳細(xì)內(nèi)容,更多關(guān)于C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#?RabbitMQ的使用詳解
- C#通過(guò)rabbitmq實(shí)現(xiàn)定時(shí)任務(wù)(延時(shí)隊(duì)列)
- C#利用RabbitMQ實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)消息傳輸
- C#使用RabbitMq隊(duì)列(Sample,Work,Fanout,Direct等模式的簡(jiǎn)單使用)
- c# rabbitmq 簡(jiǎn)單收發(fā)消息的示例代碼
- C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼
- C#操作RabbitMQ的完整實(shí)例
- C#實(shí)現(xiàn)rabbitmq 延遲隊(duì)列功能實(shí)例代碼
- C#使用RabbitMQ發(fā)送和接收消息工具類(lèi)的實(shí)現(xiàn)
相關(guān)文章
C#實(shí)現(xiàn)的文件壓縮和解壓縮類(lèi)
這篇文章主要介紹了C#實(shí)現(xiàn)的文件壓縮和解壓縮類(lèi),實(shí)例分析了C#針對(duì)文件壓縮與解壓縮的常用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03C#實(shí)現(xiàn)Json文件讀寫(xiě)的方法代碼
這篇文章主要給大家介紹了關(guān)于C#實(shí)現(xiàn)Json文件讀寫(xiě)的相關(guān)資料,C# 讀取JSON文件并讀取某一個(gè)關(guān)鍵字的值可以使用Newtonsoft.Json庫(kù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11C#使用XSLT實(shí)現(xiàn)xsl、xml與html相互轉(zhuǎn)換
這篇文章介紹了C#使用XSLT實(shí)現(xiàn)xsl、xml與html相互轉(zhuǎn)換的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C#實(shí)現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文方法合集
這篇文章介紹了C#實(shí)現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文的方法合集,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Unity?UGUI的Canvas畫(huà)布組件使用示例詳解
這篇文章主要介紹了Unity?UGUI的Canvas畫(huà)布組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07WinForm之BindingSource基礎(chǔ)操作實(shí)例教程
這篇文章主要介紹了WinForm之BindingSource基礎(chǔ)操作,對(duì)BindingSource組建的用法進(jìn)行較為深入的實(shí)例分析,需要的朋友可以參考下2014-08-08C#無(wú)損轉(zhuǎn)換Image為Icon的方法
這篇文章主要為大家詳細(xì)介紹了C#無(wú)損轉(zhuǎn)換Image為Icon的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04C#多線(xiàn)程系列之任務(wù)基礎(chǔ)(一)
本文詳細(xì)講解了C#多線(xiàn)程的任務(wù)基礎(chǔ),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02