この記事では、PHP 用 SDK を使用してキューの作成、メッセージの送信、メッセージの受信と削除、およびキューの削除を行う方法について説明します。
手順 1:環境を準備する
C# 用 SDK の最新バージョンをダウンロードし、パッケージを解凍して、Visual Studio にソリューションとしてフォルダを追加します。
ソリューションには 4 つのプロジェクトが含まれています。AliyunSDK_MNS プロジェクトを右クリックし、[リビルド] を選択します。Aliyun.MNS.dll ファイルは、プロジェクトの bin ディレクトリに生成されます。
説明他のプロジェクトの参照として Aliyun.MNS.dll ファイルを指定します。
キューの管理に使用できるサンプルコードを表示するには、AliyunSDK_MNS_Sample プロジェクトの SyncTopicSample.cs ファイルを開きます。
AliyunSDK_MNS_Sample をスタートアッププロジェクトとして、SyncTopicSample をスタートアップオブジェクトとして設定します。
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);
}