各位,上一篇基本概念和架構中,我們介紹了Window Azure ServiceBus的消息隊列技術的概覽。接下來,我們進入編程模式和詳細功能介紹模式,一點一點把ServiceBus技術研究出來。
本章我們主要介紹ServiceBus的編程SDK編程入門。
首先,微軟提供了兩個主要的Nuget Packages:
Microsoft Azure Service Bus 3.4.0
主要的NameSpace有以下幾個:
1. Microsoft.ServiceBus,這個下面有兩個主要的類:TokenProvider(用於創建Azure ServiceBus連接Token)NamespaceManager(管理ServiceBus的命名空間)。
2. Microsoft.ServiceBus.Messaging,這個命名空間下面主要提供了:MessageSession、BrokeredMessage、QueueClient、TopicClient、TopicDescription、QueueDescription、SubscriptionClient、SubscriptionDescription等核心類。
在正式編碼之前,需要我們在Windows Azure的Portal上建立ServiceBus的NameSpace:
我們新建一個命名空間:servicebustest,選擇的類型是:消息
新建完成后處於活動(可用)的狀態:
接下來,我們要獲取兩個重要的配置:連接串和主秘鑰
請將連接字符串拷貝下來,備用。
請將主秘鑰拷貝下來,備用。
啟動我們的ServiceBus的連接編碼,首先需要在應用程序配置文件中增加ServiceBus的連接信息:
<appSettings> <!-- Service Bus specific app setings for messaging connections --> <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://servicebustest.servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=主秘鑰"/> </appSettings>
后續,所有的ServiceBus的連接操作,都會讀取這個配置節。我們通過case by case的方式,show 給大家:
首先:ServiceBus的命名空間管理器:Microsoft.ServiceBus.NamespaceManager
這里,我們主要用以下兩個方法來實例化:
public static NamespaceManager Create(); 例如:
var namespaceClient = NamespaceManager.Create();
通過NamespaceManager這個類,我們可以創建、刪除、獲取、重命名、更新、判斷是否存在:隊列、主題、訂閱、規則等
1. 消息隊列的創建、是否存在判斷、刪除操作
private void CreateQueue(string queueName, bool isRequiresSession = true) { var nm = NamespaceManager.Create(); if (nm.QueueExists(queueName)) { nm.DeleteQueue(queueName); } var queue = new QueueDescription(queueName) { RequiresSession = isRequiresSession }; nm.CreateQueue(queue); nm.DeleteQueue(queueName); }
2. 創建QueueClient,用於發送、接收消息
/// <summary> /// 創建隊列客戶端 /// </summary> /// <returns>隊列客戶端</returns> public QueueClient CreateQueueClient(string queueName, ReceiveMode mode = ReceiveMode.ReceiveAndDelete) { var namespaceClient = NamespaceManager.Create(); return QueueClient.Create(queueName,mode); }
3. 主題的創建、刪除、是否存在判斷
private void CreateTopic(string topicName) { var nm = NamespaceManager.Create(); if (nm.TopicExists(topicName)) { nm.DeleteTopic(topicName); } var topic = new TopicDescription(topicName); nm.CreateTopic(topic); nm.DeleteTopic(topicName); }
4. 創建TopicClient,用於主題的發送和訂閱接收消息
/// <summary> /// 創建主題客戶端 /// </summary> /// <returns>主題客戶端</returns> public TopicClient GetTopicClient(string topicName) { var namespaceClient = NamespaceManager.Create(); return TopicClient.Create(topicName); }
5. 創建消息BrokeredMessage,設置消息的屬性
/// <summary> /// 構造消息 /// </summary> /// <param name="serializableObject">可序列化的對象</param> /// <returns>消息</returns> public static BrokeredMessage Create(Object serializableObject) { var serializer = new DataContractSerializer(serializableObject.GetType(),new DataContractSerializerSettings(){ IgnoreExtensionDataObject = true, PreserveObjectReferences = false}); var message = new BrokeredMessage(serializableObject); message.Properties.Add("Type", serializableObject.GetType().ToString()); return message; }
6.發送消息
/// <summary> /// 發送多條消息 /// </summary> /// <param name="receivePayBills">收發貨訂單集合</param> public void Send(List<ReceivePayBill> receivePayBills) { var queueClient = GetQueueClient(queueName); foreach (var receivePayBill in receivePayBills) { var message = this.Create(receivePayBill); queueClient.Send(message); } queueClient.Close(); }
7. 接收消息
/// <summary> /// 接收消息 /// </summary> /// <returns>收付款訂單</returns> public List<ReceivePayBill> Receive() { var bills = new List<ReceivePayBill>(2); var queueClient = GetReceiveQueueClient(queueName, ReceiveMode.ReceiveAndDelete); BrokeredMessage message; while ((message = queueClient.Receive()) != null) { bills.Add(message.GetBody<ReceivePayBill>()); } return bills; }
還有很多其他的示例代碼。本文只是一個簡單的入門級教程,接下來我們將按MQ場景逐個展示ServiceBus Messaging的特性。