https://www.cnblogs.com/zhangweizhong/p/5708586.html
一、客戶端
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);
}
}
}
3. 增加IProcessMessage類,定義了一個消息方法,用於消息傳遞
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Weiz.MQ
{
public interface IProcessMessage
{
void ProcessMsg(Message msg);
}
}
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; }
}
}
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)
{
//處理連接消息服務器異常
}
}
}
}
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);
}
}
}
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);
}
}
}
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. 啓動 Weiz.Consumer (消費者),啓動消費者,會自動在RabbitMQ 服務器上創建相關的exchange 和 queue 。
Consumer 消費者,使用的是Subscribe (訂閱)的模式,所以,Weiz.Consumer客戶端啓動後,會自動創建connection,生成相關的exchange 和queue。
2. 啓動Weiz. Producer 裏的TestMQ.aspx 頁面,往隊列裏面寫一條消息。訂閱的消費者立馬就能拿到這條消息。
至此,C#向Rabbitmq消息隊列發送消息已經簡單完成。