本文介紹如何使用C# SDK創建隊列、發送消息、接收和刪除消息、以及刪除隊列。
步驟一:準備工作
下載最新版C# SDK,解壓后將工程導入到VisualStudio。
找到工程里四個項目中SDK所在的項目AliyunSDK_MNS,單擊鼠標右鍵,選擇重新生成,在bin目錄下生成Aliyun.MNS.dll。
說明其他幾個項目里都需要引用這個生成的dll,請配置好其他幾個項目的引用。
在項目AliyunSDK_MNS_Sample里進行配置。
將項目AliyunSDK_MNS_Sample設置為啟動項,并將SyncOperationSample設置為啟動對象。
打開文件SyncOperationSample.cs,在文件的最上方配置AccessKeyID、AccessKeySecret和Endpoint。
AccessKeyId、AccessKeySecret
訪問阿里云API的密鑰對。
如果使用阿里云賬號訪問,請登錄AccessKey管理頁面創建和查看。
如果使用RAM用戶訪問,請登錄阿里云訪問控制控制臺查看。
Endpoint
訪問輕量消息隊列(原 MNS)的接入地址,請登錄輕量消息隊列(原 MNS)控制臺查看。具體操作,請參見獲取接入點。
不同地域的接入地址不同。
步驟二:創建隊列
如果之前未創建隊列,那么首先需要創建隊列。默認創建的隊列名稱是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);
}
步驟三:發送消息
創建隊列后可以向隊列中發送消息。
try
{
// 1.獲取Queue的實例。
var nativeQueue = client.GetNativeQueue(_queueName);
// 2.生成SendMessageRequest,可以對Message有一些額外的屬性設置。
var sendMessageRequest = new SendMessageRequest("阿里云<MessageBody>計算");
// 3.發送消息。也可以直接使用nativeQueue.SendMessage("MessageBody")。
var sendMessageResponse = nativeQueue.SendMessage(sendMessageRequest);
Console.WriteLine("Send message succeed“);
}
catch (MNSException me)
{
// 4.如果創建隊列出錯,可以根據具體的錯誤Code做處理,也可以分別Catch QueueNotExistException等做單獨處理。
Console.WriteLine("SendMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Send message failed, exception info: " + ex.Message);
}
步驟四:接收和刪除消息
現在隊列里已經有了一條消息,您可以嘗試接收消息。
NextVisibleTime是輕量消息隊列(原 MNS)的消息里一個非常重要的屬性。更多信息,請參見QueueMessage。
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
{
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);
}
文檔內容是否對您有幫助?