C# SDK を使用して、Simple Message Queue (旧称:MNS) でキューを作成し、メッセージを送信し、メッセージを受信および削除し、キューを削除する方法について説明します。
事前準備
開始する前に、以下のものが揃っていることを確認してください。
必要な権限を持つ Alibaba Cloud アカウントまたは RAM ユーザー
AccessKey ペア (AccessKey ID と AccessKey Secret)。作成するには、AccessKey 管理ページまたは RAM コンソールに移動します
キューに対応するリージョンの SMQ エンドポイント。エンドポイントはリージョンによって異なります。エンドポイントを見つけるには、MNS コンソールに移動し、[キューのエンドポイントの表示] をクリックします。詳細については、「キューのエンドポイントの表示」をご参照ください
SDK のセットアップ
最新バージョンの C# 用 SDK をダウンロードし、パッケージを解凍します。
解凍したフォルダをソリューションとして Visual Studio に追加します。このソリューションには 4 つのプロジェクトが含まれています。
AliyunSDK_MNS プロジェクトを右クリックし、[リビルド] を選択します。これにより、bin ディレクトリに Aliyun.MNS.dll ファイルが生成されます。
説明SMQ SDK を呼び出すプロジェクトには、Aliyun.MNS.dll へのリファレンスを追加してください。
AliyunSDK_MNS_Sample プロジェクト内の SyncTopicSample.cs ファイルを開きます。
Visual Studio で以下のプロパティを設定します。
AliyunSDK_MNS_Sample をスタートアップ プロジェクトとして設定します。
SyncTopicSample をスタートアップ オブジェクトとして設定します。
SyncTopicSample.cs の先頭で、ご自身の AccessKey ID、AccessKey Secret、およびエンドポイントを指定します。
キューの作成
カスタムパラメーターを使用してキューを作成します。サンプルコードのデフォルトのキュー名は myqueue です。
// キューのパラメーターを設定します。完全なリストについては、API リファレンスの「Queue」をご参照ください。
var createQueueRequest = new CreateQueueRequest
{
QueueName = _queueName,
Attributes =
{
VisibilityTimeout = 30, // 受信したメッセージが非表示になる秒数。デフォルト:30。
MaximumMessageSize = 40960, // メッセージの最大サイズ (バイト単位)。
MessageRetentionPeriod = 345600, // メッセージが保持される秒数。デフォルト:345600 (4 日間)。
PollingWaitSeconds = 30 // ロングポーリングのタイムアウト秒数。最大:30。
}
};
try
{
var queue = client.CreateQueue(createQueueRequest);
Console.WriteLine("Create queue successfully, queue name: {0}", queue.QueueName);
}
catch (MNSException me)
{
// 一般的な原因:ネットワークエラー、キュー名が既に存在する。
Console.WriteLine("CreateQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Create queue failed, exception info: " + ex.Message);
}デフォルトのパラメーターでキューを作成するには、client.CreateQueue(_queueName) を直接呼び出します。
メッセージの送信
キューが作成された後、メッセージを送信します。
try
{
// キューへのリファレンスを取得します。
var nativeQueue = client.GetNativeQueue(_queueName);
// メッセージ本文を含む送信リクエストを構築します。
var sendMessageRequest = new SendMessageRequest("Alibaba<MessageBody>Cloud");
// メッセージを送信します。
var sendMessageResponse = nativeQueue.SendMessage(sendMessageRequest);
Console.WriteLine("Send message succeed");
}
catch (MNSException me)
{
Console.WriteLine("SendMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Send message failed, exception info: " + ex.Message);
}追加のパラメーターなしでプレーンテキストメッセージを送信するには、nativeQueue.SendMessage("MessageBody") を呼び出します。
メッセージの受信と削除
メッセージの受信
ReceiveMessage を呼び出して、キューからメッセージをプルします。WaitSeconds の値を渡してロングポーリングを有効にします。リクエストは、メッセージが到着するか、タイムアウトが切れるまで保留されます。SMQ では NextVisibleTime パラメーターを指定する必要があります。NextVisibleTime およびその他のメッセージ属性の詳細については、「QueueMessage」をご参照ください。
try
{
// 最大 30 秒間のロングポーリング。
var receiveMessageResponse = nativeQueue.ReceiveMessage(30);
// 後で削除するために受信ハンドルを保存します。
// 受信ハンドルは VisibilityTimeout の期間中有効です。
_receiptHandle = message.ReceiptHandle;
}
catch (MNSException me)
{
Console.WriteLine("ReceiveMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("ReceiveMessage failed, exception info: " + ex.Message);
}ロングポーリング: WaitSeconds がゼロ以外の値 (最大 30) の場合、リクエストはメッセージが利用可能になるか、タイムアウトが経過するまで待機します。これにより、空の応答のポーリングが減り、コストが削減されます。
可視性タイムアウト: クライアントがメッセージを受信すると、メッセージは VisibilityTimeout の期間、非アクティブ状態になります。このウィンドウの間、他のクライアントは同じメッセージを受信できません。タイムアウトが切れると、メッセージはアクティブ状態に戻り、他のコンシューマーが利用できるようになります。これにより、コンシューマーが予期せず終了した場合のメッセージ損失を防ぎます。
メッセージの削除
メッセージを処理した後、受信ハンドルを使用してキューからメッセージを削除します。受信ハンドルが期限切れになる前にメッセージを削除してください。そうしないと、ハンドルが無効になります。
try
{
var deleteMessageResponse = nativeQueue.DeleteMessage(_receiptHandle);
}
catch (MNSException me)
{
// MessageNotExist エラーは、受信ハンドルが期限切れになったことを意味します。
// これを回避するには、VisibilityTimeout をアプリケーションがメッセージを処理するのに
// 十分な時間を与える値に設定するか、
// changeMessageVisibility() を呼び出して延長します。
Console.WriteLine("DeleteMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Delete message failed, exception info: " + ex.Message);
}ヒント: メッセージの処理がデフォルトの可視性タイムアウトより長くかかる場合は、受信ハンドルが期限切れになる前に changeMessageVisibility() を呼び出してタイムアウトを延長してください。キューの削除
キューが不要になったら、リソースを解放するために削除します。
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);
}