溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸

發(fā)布時間:2021-05-17 11:18:11 來源:億速云 閱讀:255 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

消息隊列模型

所有 MQ 產(chǎn)品從模型抽象上來說都是一樣的過程:
消費者(consumer)訂閱某個隊列。生產(chǎn)者(producer)創(chuàng)建消息,然后發(fā)布到隊列(queue)中,最后將消息發(fā)送到監(jiān)聽的消費者。

C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸

RabbitMQ設(shè)置

RabbitMQ是通過交換機將消息轉(zhuǎn)發(fā)到對應(yīng)隊列,所以隊列需要和交換機進行綁定。本例將隊列綁定到默認的amq.direct交換機,并設(shè)置Routing key,如下圖所示:

C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸

RabbitMQ動態(tài)庫安裝

通過NuGet包管理器進行安裝RabbitMQ.Client,如下所示:

C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸

RabbitMQ.Client相關(guān)知識點

  • ConnectionFactory:構(gòu)造一個實例,主要創(chuàng)建連接。

  • IConnection:表示一個基于AMQP協(xié)議的連接。

  • IModel:表示一個RabbitMQ通道,可用于聲明一個隊列,然后開始消費。

  • EventingBasicConsumer:基于獨立事件監(jiān)聽的基礎(chǔ)消費者,可以監(jiān)聽并接收消息。

  • 生產(chǎn)者基本步驟:1. 創(chuàng)建連接 2. 基于連接創(chuàng)建通道 3. 基于通道聲明隊列,4. 開始生產(chǎn)并發(fā)布消息

  • 消費者基本步驟:1. 創(chuàng)建連接 2. 基于連接創(chuàng)建通道 3. 基于通道聲明隊列,4. 創(chuàng)建消費者,5. 綁定通道和消費者,并開始消費

示例效果圖

本例主要有一個生產(chǎn)者,一個消費者,通過消息隊列進行消息轉(zhuǎn)發(fā)和接收。

生產(chǎn)者負責(zé)消息發(fā)送,如下圖所示:

C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸

消費者負責(zé)消息接收,如下圖所示:

C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸

核心代碼

代碼結(jié)構(gòu):主要包括生產(chǎn)者,消費者,公共基礎(chǔ)代碼,如下所示:

C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸

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

C#是什么

C#是一個簡單、通用、面向?qū)ο蟮木幊陶Z言,它由微軟Microsoft開發(fā),繼承了C和C++強大功能,并且去掉了一些它們的復(fù)雜特性,C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程從而成為.NET開發(fā)的首選語言,但它不適用于編寫時間急迫或性能非常高的代碼,因為C#缺乏性能極高的應(yīng)用程序所需要的關(guān)鍵功能。

以上是“C#如何利用RabbitMQ實現(xiàn)點對點消息傳輸”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI