すべてのプロダクト
Search
ドキュメントセンター

Simple Message Queue (formerly MNS):キューの管理

最終更新日:Jan 13, 2025

この記事では、PHP 用 SDK を使用してキューの作成、メッセージの送信、メッセージの受信と削除、およびキューの削除を行う方法について説明します。

手順 1:環境を準備する

  1. C# 用 SDK の最新バージョンをダウンロードし、パッケージを解凍して、Visual Studio にソリューションとしてフォルダを追加します。

  2. ソリューションには 4 つのプロジェクトが含まれています。AliyunSDK_MNS プロジェクトを右クリックし、[リビルド] を選択します。Aliyun.MNS.dll ファイルは、プロジェクトの bin ディレクトリに生成されます。

    説明

    他のプロジェクトの参照として Aliyun.MNS.dll ファイルを指定します。

  3. キューの管理に使用できるサンプルコードを表示するには、AliyunSDK_MNS_Sample プロジェクトの SyncTopicSample.cs ファイルを開きます。

    1. AliyunSDK_MNS_Sample をスタートアッププロジェクトとして、SyncTopicSample をスタートアップオブジェクトとして設定します。

    2. SyncTopicSample.cs ファイルを開き、ファイルの先頭に AccessKey ID、AccessKey Secret、およびエンドポイントを指定します。

      • AccessKey ID と AccessKey Secret

        • Alibaba Cloud で API オペレーションを呼び出すために使用される AccessKey ペア。

        • Alibaba Cloud アカウントを使用している場合は、Alibaba Cloud 管理コンソールの [アクセスキーの管理] ページに移動して、AccessKey ペアを作成および表示します。

        • Resource Access Management (RAM) ユーザーの場合は、[RAM コンソール] にログオンして、AccessKey ペアを表示します。

      • エンドポイント

        • Simple Message Queue (旧称 MNS) にアクセスするために使用されるエンドポイント。SMQ のエンドポイントを表示するには、MNS コンソール にログオンします。詳細については、「キューのエンドポイントを表示する」をご参照ください。

        • SMQ のエンドポイントは、リージョンによって異なります。

手順 2:キューを作成する

使用可能なキューがない場合は、キューを作成する必要があります。新しいキューのデフォルト名は myqueue です。別のキュー名を指定することもできます。

// 1.必要に応じて、キューのパラメータを指定できます。キューのパラメータの詳細については、「Queue」を参照してください。
var createQueueRequest = new CreateQueueRequest
{
    QueueName = _queueName,
    Attributes =
    {
        // VisibilityTimeout パラメータを指定する必要があります。デフォルト値:30。
        VisibilityTimeout = 30,
        MaximumMessageSize = 40960,
        MessageRetentionPeriod = 345600,
        // PollingWaitSeconds パラメータは、ロングポーリングリクエストのタイムアウト期間を指定します。
        PollingWaitSeconds = 30
    }
};

try
{
    // 2.キューを作成します。キューのパラメータを指定する必要がない場合は、client.CreateQueue(_ queueName) メソッドを使用してキューを作成できます。
    var queue = client.CreateQueue(createQueueRequest);
    Console.WriteLine("Create queue successfully, queue name: {0}", queue.QueueName);
}
catch (MNSException me)
{
    // 3.ネットワークエラーが発生した場合、またはキュー名が既に存在する場合は、キューの作成に失敗する可能性があります。CatchException オペレーションを呼び出して、障害を特定し、解決できます。
    Console.WriteLine("CreateQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Create queue failed, exception info: " + ex.Message);
}           

手順 3:メッセージを送信する

キューが作成された後、キューにメッセージを送信できます。

try
{
    // 1.キューを取得します。
    var nativeQueue = client.GetNativeQueue(_queueName);
    // 2.メッセージを送信するためのリクエストを生成します。必要に応じて、メッセージのパラメータを指定できます。
    var sendMessageRequest = new SendMessageRequest("Alibaba<MessageBody>Cloud");
    // 3.メッセージを送信します。メッセージのパラメータを指定する必要がない場合は、nativeQueue.SendMessage ("MessageBody") メソッドを使用できます。
    var sendMessageResponse = nativeQueue.SendMessage(sendMessageRequest);
    Console.WriteLine("Send message succeed“);
}
catch (MNSException me)
{
    // 4.ネットワークエラーが発生した場合、またはキュー名が既に存在する場合は、キューの作成に失敗する可能性があります。CatchException オペレーションを呼び出して、障害を特定し、解決できます。
    Console.WriteLine("SendMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Send message failed, exception info: " + ex.Message);
}            

手順 4:メッセージを受信して削除する

キューにメッセージが存在する場合は、メッセージを受信できます。

SMQ では NextVisibleTime パラメータを指定する必要があります。詳細については、「QueueMessage」をご参照ください。

try
{
    // 1.receiveMessage() 関数を呼び出します。
    // receiveMessage() 関数を呼び出すときは、WaitSeconds パラメータを 30 に設定することをお勧めします。
    // WaitSeconds パラメータをゼロ以外の値に設定すると、メッセージを受信するリクエストは HTTP ロングポーリングリクエストになります。ロングポーリングリクエストは、キューでメッセージが使用可能になるまで保持されます。WaitSeconds パラメータの最大値は 30 です。
    var receiveMessageResponse = nativeQueue.ReceiveMessage(30);
    // 2.ReceiptHandle パラメータの値を取得します。メッセージの受信ハンドルには有効期限があり、メッセージの変更または削除に使用できます。詳細については、「QueueMessage」を参照してください。
    _receiptHandle = message.ReceiptHandle;
}
catch (MNSException me)
{
    // 3.エラーが発生した場合、メッセージの受信に失敗する可能性があります。CatchException オペレーションを呼び出して、障害を特定し、解決できます。
    Console.WriteLine("ReceiveMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("ReceiveMessage failed, exception info: " + ex.Message);
}

// 必要に応じて、メッセージを処理するための独自のロジックを指定します。
// VisibilityTimeout パラメータは、クライアントがメッセージを消費した後、メッセージがキュー内で非アクティブ状態のままである期間を指定します。指定された期間が経過すると、メッセージは再びアクティブ状態になり、他のクライアントが消費できるようになります。これにより、予期しない終了に対するメッセージの損失を防ぎます。

// 4.メッセージが消費された後、キューからメッセージを削除できます。
try
{
    // 5.deleteMessage() 関数を呼び出します。
    var deleteMessageResponse = nativeQueue.DeleteMessage(_receiptHandle);
}
catch (MNSException me)
{
    // 6.エラーが発生した場合は、CatchException オペレーションを呼び出して、障害を特定し、解決できます。
    // 受信ハンドルが期限切れになると、MessageNotExist エラーが返されます。このエラーは、受信ハンドルを使用して対応するメッセージを見つけることができないことを示しています。
    // 受信ハンドルの期限が切れる前にメッセージを確実に消費できるようにするには、VisibilityTimeout パラメータを適切な値に設定する必要があります。changeMessageVisibility() 関数を呼び出して、VisibilityTimeout パラメータの値を変更できます。
    Console.WriteLine("DeleteMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Delete message failed, exception info: " + ex.Message);
}            

手順 5:キューを削除する

次のサンプルコードを使用してキューを削除できます。

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);
}