全部產品
Search
文件中心

Simple Message Queue (formerly MNS):隊列使用手冊

更新時間:Jan 25, 2025

本文介紹如何使用C# SDK建立隊列、發送訊息、接收和刪除訊息、以及刪除隊列。

步驟一:準備工作

  1. 下載最新版C# SDK,解壓後將工程匯入到VisualStudio。

  2. 找到工程裡四個專案中SDK所在的專案AliyunSDK_MNS,單擊滑鼠右鍵,選擇重建,在bin目錄下產生Aliyun.MNS.dll

    說明

    其他幾個專案裡都需要引用這個產生的dll,請配置好其他幾個專案的引用。

  3. 在專案AliyunSDK_MNS_Sample裡進行配置。

    1. 將專案AliyunSDK_MNS_Sample設定為啟動項,並將SyncOperationSample設定為啟始物件。

    2. 開啟檔案SyncOperationSample.cs,在檔案的最上方配置AccessKeyID、AccessKeySecret和Endpoint。

步驟二:建立隊列

如果之前未建立隊列,那麼首先需要建立隊列。預設建立的隊列名稱是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);
}