C#利用RabbitMQ實現(xiàn)點(diǎn)對點(diǎn)消息傳輸
消息隊列模型
所有 MQ 產(chǎn)品從模型抽象上來說都是一樣的過程:
消費(fèi)者(consumer)訂閱某個隊列。生產(chǎn)者(producer)創(chuàng)建消息,然后發(fā)布到隊列(queue)中,最后將消息發(fā)送到監(jiān)聽的消費(fèi)者。
RabbitMQ設(shè)置
RabbitMQ是通過交換機(jī)將消息轉(zhuǎn)發(fā)到對應(yīng)隊列,所以隊列需要和交換機(jī)進(jìn)行綁定。本例將隊列綁定到默認(rèn)的amq.direct交換機(jī),并設(shè)置Routing key,如下圖所示:
RabbitMQ動態(tài)庫安裝
通過NuGet包管理器進(jìn)行安裝RabbitMQ.Client,如下所示:
RabbitMQ.Client相關(guān)知識點(diǎn)
- ConnectionFactory:構(gòu)造一個實例,主要創(chuàng)建連接。
- IConnection:表示一個基于AMQP協(xié)議的連接。
- IModel:表示一個RabbitMQ通道,可用于聲明一個隊列,然后開始消費(fèi)。
- EventingBasicConsumer:基于獨(dú)立事件監(jiān)聽的基礎(chǔ)消費(fèi)者,可以監(jiān)聽并接收消息。
- 生產(chǎn)者基本步驟:1. 創(chuàng)建連接 2. 基于連接創(chuàng)建通道 3. 基于通道聲明隊列,4. 開始生產(chǎn)并發(fā)布消息
- 消費(fèi)者基本步驟:1. 創(chuàng)建連接 2. 基于連接創(chuàng)建通道 3. 基于通道聲明隊列,4. 創(chuàng)建消費(fèi)者,5. 綁定通道和消費(fèi)者,并開始消費(fèi)
示例效果圖
本例主要有一個生產(chǎn)者,一個消費(fèi)者,通過消息隊列進(jìn)行消息轉(zhuǎn)發(fā)和接收。
生產(chǎn)者負(fù)責(zé)消息發(fā)送,如下圖所示:
消費(fèi)者負(fù)責(zé)消息接收,如下圖所示:
核心代碼
代碼結(jié)構(gòu):主要包括生產(chǎn)者,消費(fèi)者,公共基礎(chǔ)代碼,如下所示:
RabbitMqHelper主要創(chuàng)建連接,如下所示:
public class RabbitMqHelper { /// <summary> /// 創(chuàng)建連接 /// </summary> /// <returns></returns> public IConnection GetConnection() { try { var factory = new ConnectionFactory() { HostName = "127.0.0.1", Port = 5672, UserName = "guest", Password = "guest", VirtualHost = "/ShortMsgHost" }; var conn = factory.CreateConnection(); return conn; } catch (Exception ex) { throw ex; } } }
RabbmitMqSendHelper用于發(fā)送消息,如下所示:
public class RabbmitMqSendHelper : RabbitMqHelper { /// <summary> /// 發(fā)送消息 /// </summary> /// <param name="msg"></param> /// <returns></returns> public bool SendMsg(string msg) { try { using (var conn = GetConnection()) { using (var channel = conn.CreateModel()) { channel.QueueDeclare(queue: "ShortMsgQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); var body = Encoding.UTF8.GetBytes(msg); channel.BasicPublish(exchange: "amq.direct", routingKey: "ShortMsgKey", basicProperties: null, body: body); //Console.WriteLine(" [x] Sent {0}", message); }; }; return true; } catch (Exception ex) { throw ex; } } }
RabbitMqReceiveHelper主要用于接收信息,如下所示:
public class RabbitMqReceiveHelper : RabbitMqHelper { public RabbitMqReceiveEventHandler OnReceiveEvent; private IConnection conn; private IModel channel; private EventingBasicConsumer consumer; public bool StartReceiveMsg() { try { conn = GetConnection(); channel = conn.CreateModel(); channel.QueueDeclare(queue: "ShortMsgQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); 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(message); } }; channel.BasicConsume(queue: "ShortMsgQueue", autoAck: true, consumer: consumer); return true; } catch (Exception ex) { throw ex; } } }
作者:Alan.hsiang
出處:http://www.cnblogs.com/hsiang/
以上就是C#利用RabbitMQ實現(xiàn)點(diǎn)對點(diǎn)消息傳輸?shù)膶崿F(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于c# 用RabbitMQ實現(xiàn)點(diǎn)對點(diǎn)消息傳輸?shù)馁Y料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#/VB.NET 在PDF中添加文件包(Portfolio)的方法
這篇文章主要介紹了C#/VB.NET 在PDF中添加文件包(Portfolio)的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-06-06C#中XmlTextWriter讀寫xml文件詳細(xì)介紹
.NET中包含了很多支持XML的類,這些類使得程序員使用XML編程就如同理解XML文件一樣簡單。在這篇文章中,我將給出這樣的一個類的使用示例,這個類就是XmlTextWriter類2013-04-04