RabbitMQ學習系列(三): C# 如何使用 RabbitMQ


 

上一篇已經講了Rabbitmq如何在Windows平台安裝,還不了解如何安裝的朋友,請看我前面幾篇文章:RabbitMQ學習系列一:windows下安裝RabbitMQ服務 , 今天就來聊聊 C# 實際開發的過程中,怎么調用 用RabbitMQ。


  一、客戶端 

    RabbitMQ.Client 是rabbitmq 官方提供的的客戶端,net 版本地址 :http://www.rabbitmq.com/dotnet.html 

    EasyNetQ 是基於RabbitMQ.Client 基礎上封裝的開源客戶端。使用非常方便。地址:http://easynetq.com/ 。 本篇所使用示例代碼下載地址:  demo示例下載 。

    RabbitMQ 還有很多其他客戶端API,都非常的好用。我們在一邊,一直用的都是 EasyNetQ,所以這里的 demo 只介紹 EasyNetQ 客戶端實現。其他的客戶端,大家自己去研究吧。

 

  二、項目結構

    

      說明:前面我們提到過,RabbitMQ由 Producer(生成者) 和 Consumer(消費者) 兩部分組成。Weiz.Consumer 就是Consumer(消費者),Weiz. Producer 為 Producer(生成者),Weiz.MQ 為消息隊列的通用處理類庫。


  三、項目搭建

    1. Weiz.MQ 項目,消息隊列的通用處理類庫,用於正在的訂閱和發布消息。

      1. 通過nuget安裝項目EasyNetQ 相關組件, (略)

      2. 增加BusBuilder.cs管道創建類,主要負責鏈接Rabbitmq。

using System;
using System.Configuration;
using EasyNetQ;

namespace Weiz.MQ
{
    /// <summary>
    /// 消息服務器連接器
    /// </summary>
    public class BusBuilder
    {
        public static IBus CreateMessageBus()
        {
            // 消息服務器連接字符串
            // var connectionString = ConfigurationManager.ConnectionStrings["RabbitMQ"];
            string connString = "host=192.168.98.107:5672;virtualHost=OrderQueue;username=zhangweizhong;password=weizhong1988";
            if (connString == null || connString == string.Empty)
            {
                throw new Exception("messageserver connection string is missing or empty");
            }
            
            return RabbitHutch.CreateBus(connString);
        }
    }
}
View Code

 

 

      3. 增加IProcessMessage類,定義了一個消息方法,用於消息傳遞

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Weiz.MQ
{
    public interface IProcessMessage
    {
        void ProcessMsg(Message msg);
    }
}
View Code

 

 

      4. 增加Message類,定義了消息傳遞的實體屬性字段等信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Weiz.MQ
{
    public class Message
    {
        public string MessageID { get; set; }
        
        public string MessageTitle { get; set; }

        public string MessageBody { get; set; }

        public string MessageRouter { get; set; }
    }
}
View Code

 

 

      5. 增加MQHelper類,用於正在的訂閱和發布消息。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using EasyNetQ;

namespace Weiz.MQ
{
    public class MQHelper
    {
        /// <summary>
        /// 發送消息
        /// </summary>
        public static void Publish(Message msg)
        {
            //// 創建消息bus
            IBus bus = BusBuilder.CreateMessageBus();

            try
            {
                bus.Publish(msg, x => x.WithTopic(msg.MessageRouter));
            }
            catch (EasyNetQException ex)
            {
                //處理連接消息服務器異常 
            }

            bus.Dispose();//與數據庫connection類似,使用后記得銷毀bus對象
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="msg"></param>
        public static void Subscribe(Message msg, IProcessMessage ipro)
        {
            //// 創建消息bus
            IBus bus = BusBuilder.CreateMessageBus();

            try
            {
                bus.Subscribe<Message>(msg.MessageRouter, message => ipro.ProcessMsg(message), x => x.WithTopic(msg.MessageRouter));

            }
            catch (EasyNetQException ex)
            {
                //處理連接消息服務器異常 
            }
        }
    }
}
View Code

 

 

 

    2. RabbitMQ由 Producer(生成者)

      1. 創建一個aspx 頁面,增加如下代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Weiz.MQ;

namespace Weiz.Producer
{
    public partial class TestMQ : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Message msg = new Message();
            msg.MessageID = "1";
            msg.MessageBody = DateTime.Now.ToString();
            msg.MessageTitle = "1";
            msg.MessageRouter = "pcm.notice.zhangsan";
            MQHelper.Publish(msg);

        }
    }
}
View Code

 

 

    3. Weiz.Consumer 就是Consumer(消費者)

      1 . 新增OrderProcessMessage.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Weiz.Consumer
{
    public class OrderProcessMessage:MQ.IProcessMessage
    {
        public void ProcessMsg(MQ.Message msg)
        {
            Console.WriteLine(msg.MessageBody);
        }
    }
}
View Code

 

      2. Program 增加如下代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Weiz.Consumer
{
    class Program
    {
        static void Main(string[] args)
        {
            OrderProcessMessage order = new OrderProcessMessage();
            MQ.Message msg = new MQ.Message();
            msg.MessageID = "1";
            msg.MessageRouter = "pcm.notice.zhangsan";

            MQ.MQHelper.Subscribe(msg, order);
        }
    }
}
View Code

 

 

  四、運行

     1. 啟動 Weiz.Consumer (消費者),啟動消費者,會自動在RabbitMQ 服務器上創建相關的exchange 和 queue 。

      

 

 

      Consumer 消費者,使用的是Subscribe (訂閱)的模式,所以,Weiz.Consumer客戶端啟動后,會自動創建connection,生成相關的exchange 和queue。

    2. 啟動Weiz. Producer 里的TestMQ.aspx 頁面,往隊列里面寫一條消息。訂閱的消費者立馬就能拿到這條消息。

       

 

 

  至此,C#向Rabbitmq消息隊列發送消息已經簡單完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM