本文介紹如何使用C# SDK中的sample代碼,完成建立主題、建立隊列、建立訂閱和發布訊息等操作。
步驟一:準備工作
下載最新版C# SDK,解壓後將工程匯入到VisualStudio。
找到工程裡四個專案中SDK所在的專案AliyunSDK_MNS,右擊專案名,選擇重建,在bin目錄下產生Aliyun.MNS.dll。
說明其他幾個專案裡都需要引用Aliyun.MNS.dll,請配置好其他幾個專案的引用。
在專案AliyunSDK_MNS_Sample裡進行配置。
將專案AliyunSDK_MNS_Sample設定為啟動項,將SyncTopicOperations.cs設定為啟始物件。
開啟SyncTopicOperations.cs檔案,配置以下內容:
AccessKey ID、AccessKey Secret
訪問阿里雲API的金鑰組。
如果使用阿里雲帳號訪問,請登入AccessKey管理頁面建立和查看。
如果使用RAM使用者訪問,請登入阿里雲存取控制控制台查看。
Endpoint
訪問輕量訊息佇列(原 MNS)的接入地址,請登入輕量訊息佇列(原 MNS)控制台查看。具體操作,請參見擷取存取點。
不同地區的接入地址不同。
步驟二:建立主題
如果之前未建立主題,那麼首先需要建立主題。預設建立的主題名稱是TestCSharpTopic,也可以修改代碼指定主題名稱。
// 1.產生一個CreateTopicRequest執行個體,參數傳入topicName。這裡可以同時傳入TopicAttributes,以便在CreateTopic時同時設定自訂的Topic屬性。
var createTopicRequest = new CreateTopicRequest
{
TopicName = _topicName
};
Topic topic = null;
try
{
topic = client.CreateTopic(createTopicRequest);
Console.WriteLine("Create topic successfully, topic name: {0}", topic.TopicName);
}
catch (MNSException me)
{
// 2.可能因為網路錯誤,或者Topic已經存在等原因導致CreateTopic失敗,這裡CatchException並做對應的處理,也可以分別Catch TopicAlreadyExistException等做單獨處理。
Console.WriteLine("CreateTopic Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Create topic failed, exception info: " + ex.Message);
return;
} 步驟三:建立隊列
如果之前未建立隊列,那麼首先需要建立隊列。預設建立的隊列名稱是myqueue,也可以修改代碼指定隊列名稱。
// 1.這裡我們指定了Queue的一些屬性。對於Queue的屬性,請參見Queue。
var createQueueRequest = new CreateQueueRequest
{
QueueName = _queueName,
Attributes =
{
// VisibilityTimeout是最重要的屬性,預設為30秒。
VisibilityTimeout = 30,
MaximumMessageSize = 40960,
MessageRetentionPeriod = 345600,
// PollingWaitSeconds是非常重要的長輪詢逾時時間。
PollingWaitSeconds = 30
}
};
try
{
// 2.建立隊列。如果不需要特別指定Queue的屬性,也可以直接使用client.CreateQueue(_queueName)。
var queue = client.CreateQueue(createQueueRequest);
Console.WriteLine("Create queue successfully, queue name: {0}", queue.QueueName);
}
catch (MNSException me)
{
// 3.如果建立隊列出錯,可以根據具體的錯誤Code做處理,也可以分別Catch QueueAlreadyExistException等做單獨處理。
Console.WriteLine("CreateQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Create queue failed, exception info: " + ex.Message);
} 步驟四:建立訂閱
對已建立的主題進行訂閱。
string region = "";
string accountId = "";
string queueName = "TestQueue";
try
{
// 1.產生SubscriptionAttributes,第二個參數是Subscription的Endpoint。
SubscribeResponse res = topic.Subscribe(_subscriptionName, "acs:mns:" + region +":" + accountId +":queues/" + queueName);
// 2.訂閱成功。
Console.WriteLine("Subscribe succeed");
}
catch (MNSException me)
{
// 3.可能因為網路錯誤,或者同名的Subscription已存在等原因導致訂閱出錯,這裡CatchException並做對應的處理。
Console.WriteLine("Subscribe Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Subscribe failed, exception info: " + ex.Message);
} 步驟五:發布訊息
發布訊息到主題中。
try
{
var response = topic.PublishMessage("message here </asdas\">");
// 1.發布成功。
Console.WriteLine("PublishMessage succeed! " + response.MessageId);
}
catch (MNSException me)
{
// 2.可能因為網路錯誤等原因導致PublishMessage失敗,這裡CatchException並做對應處理。
Console.WriteLine("PublishMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("PublishMessage failed, exception info: " + ex.Message);
} 步驟六:從隊列接收和刪除訊息
訊息從主題推送到隊列後,從隊列中取出並刪除該條訊息。
try
{
// 1.直接調用receiveMessage函數。
// receiveMessage函數接受waitSeconds參數,無特殊情況建議設定為30。
// waitSeconds非0表示這次receiveMessage是一次http long polling,如果queue內剛好沒有message,那麼這次request會在server端等到queue內有訊息才返回。最長等待時間為waitSeconds的值,最大為30。
var receiveMessageResponse = nativeQueue.ReceiveMessage(30);
// 2.擷取ReceiptHandle,這是一個有時效性的Handle,可以用來設定Message的各種屬性和刪除Message。更多資訊,請參見QueueMessage。
_receiptHandle = message.ReceiptHandle;
}
catch (MNSException me)
{
// 3.和CreateQueue和SendMessage一樣,ReceiveMessage也是有可能出錯的,所以這裡加上CatchException並做對應的處理。
Console.WriteLine("ReceiveMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("ReceiveMessage failed, exception info: " + ex.Message);
}
// 這裡是您自己處理訊息的邏輯。Sample裡就直接略過這一步了。
// 如果這裡發生了程式崩潰或卡住等異常情況,對應的Message會在VisibilityTimeout之後重新可見,從而可以被其他進程處理,避免訊息丟失。
// 4.訊息處理完成,可以從隊列裡刪除這條訊息。
try
{
// 5.直接調用deleteMessage。
var deleteMessageResponse = nativeQueue.DeleteMessage(_receiptHandle);
}
catch (MNSException me)
{
// 6.這裡CatchException並做異常處理。
// 如果是receiptHandle已經到期,那麼ErrorCode是MessageNotExist,表示通過這個receiptHandle已經找不到對應的訊息。
// 為了保證receiptHandle不到期,VisibilityTimeout的設定需要保證足夠訊息處理完成。並且在訊息處理過程中,也可以調用changeMessageVisibility這個函數來延長訊息的VisibilityTimeout時間。
Console.WriteLine("DeleteMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Delete message failed, exception info: " + ex.Message);
} 步驟七:刪除主題
刪除測試主題。
try
{
client.DeleteTopic(_topicName);
Console.WriteLine("Delete topic succeed");
}
catch (Exception ex)
{
Console.WriteLine("Delete topic failed, exception info: " + ex.Message);
} 步驟八:刪除隊列
刪除測試隊列。
try
{
var deleteQueueResponse = client.DeleteQueue(deleteQueueRequest);
}
catch (MNSException me)
{
Console.WriteLine("DeleteQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Delete queue failed, exception info: " + ex.Message);
}