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 為訊息佇列的通用處理類庫。

三、如何實現

首先建立Weiz。MQ 專案,Weiz。MQ 是訊息佇列的通用處理類庫,用於建立的RabbitMQ連線、傳送和訂閱訊息等功能。

1、增加BusBuilder。cs管道建立類,主要負責連結Rabbitmq。

using System;using System。Configuration;using EasyNetQ;namespace Weiz。MQ{ ///

/// 訊息伺服器聯結器 /// 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); } }}

2、增加IProcessMessage介面

主要是定義了一個ProcessMsg訊息方法,用於訊息傳遞。

using System;using System。Collections。Generic;using System。Linq;using System。Text;namespace Weiz。MQ{ public interface IProcessMessage { void ProcessMsg(Message msg); }}

3、增加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; } }}

4、增加MQHelper類,用於正在的訂閱和釋出訊息。

using System;using System。Collections。Generic;using System。Linq;using System。Text;using System。Configuration;using EasyNetQ;namespace Weiz。MQ{ public class MQHelper { ///

/// 傳送訊息 /// 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物件 } /// /// 接收訊息 /// /// public static void Subscribe(Message msg, IProcessMessage ipro) { //// 建立訊息bus IBus bus = BusBuilder。CreateMessageBus(); try { bus。Subscribe(msg。MessageRouter, message => ipro。ProcessMsg(message), x => x。WithTopic(msg。MessageRouter)); } catch (EasyNetQException ex) { //處理連線訊息伺服器異常 } } }}

然後,建立生產者Weiz。Producer工程

在Weiz。Producer工程中,建立一個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); } }}

程式碼說明:

“pcm。notice。zhangsan”,是訂閱的訊息路由。

最後、建立消費者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); } }}

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

程式碼說明:

1、這裡就是訂閱一個訊息路由,pcm。notice。zhangsan

2、還需要注意的是:一般是先啟動消費者,建立對應的訊息路由和佇列。

四、執行測試

1、首先啟動 Weiz。Consumer (消費者),啟動消費者,這樣會自動在RabbitMQ 伺服器上建立相關的exchange 和 queue 。

RabbitMQ學習系列(三)如何訂閱和釋出訊息?

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

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

RabbitMQ學習系列(三)如何訂閱和釋出訊息?

上圖可以看到,消費者順利收到了一條訊息。

最後

至此,C#向Rabbitmq訊息佇列傳送訊息已經簡單完成。需要完整程式碼可以私信我(

章為忠學架構

),回覆:

rabbitmq

即可。

推薦閱讀:

RabbitMQ學習系列(二): RabbitMQ的安裝與配置管理後臺

RabbitMQ學習系列(一): RabbitMQ快速入門