Amazon Simple Queue Service
開発者ガイド

チュートリアル: Amazon SQS キューからのメッセージの受信および削除

キューにメッセージを送信した後、それをキューから消費できます。キューからのメッセージをリクエストする場合、どのメッセージを取得するか指定することはできません。代わりに、取得するメッセージの最大数を指定します (最大 10)。

注記

Amazon SQS は分散システムであるため、キューにあるメッセージが非常に少ない場合は、受信したリクエストに対して空のレスポンスを表示する場合があります。この場合、リクエストを再実行してメッセージを取得できます。アプリケーションの必要に応じて、メッセージを受信するためにショートポーリングまたはロングポーリングを使用する必要がある場合があります。

Amazon SQS では、メッセージが正常に受信されなかった場合 (たとえばコンシューマーに障害があったり接続が失われた場合) に備えて、メッセージの受信後、自動的にメッセージを削除することはありません。メッセージを削除するには、別のリクエストを送信する必要があります。これによって、正常にメッセージを受信して処理したためそのメッセージが不要になったことを通知します。

このチュートリアルでは、メッセージを受信および削除する方法について説明します。

AWS マネジメントコンソール

  1. Amazon SQS コンソールにサインインします。

  2. キューの一覧から、キューを選択します。

  3. [Queue Actions] の [View/Delete Messages] を選択します。

    [View/Delete Messages in QueueName] ダイアログボックスが表示されます。

    注記

    初めてこのアクションを行うときは、情報画面が表示されます。画面を非表示にするには、[Don't show this again] チェックボックスをオンにします。

  4. [Start Polling for messages] を選択します。

    Amazon SQS によって、キューのメッセージのポーリングが開始されます。ダイアログボックスにキューのメッセージが表示されます。ダイアログボックスの下部に進捗バーが表示され、メッセージの可視性タイムアウトの状態が示されます。

    次の例は、FIFO キュー特有の [Message Group ID]、[Message Deduplication ID]、および [Sequence Number] 列を示しています。

  5. 可視性タイムアウトの期限が切れるに削除するメッセージを選択して、[Delete 1 Message] を選択します。

    [Delete Messages] ダイアログボックスが表示されます。

  6. 削除するメッセージにチェックが入っていることを確認して、[Yes, Delete Checked Messages] を選択します。

    選択したメッセージが削除されます。

    進行状況バーがいっぱいになると、可視性タイムアウトが期限切れになり、メッセージがコンシューマーから見えるようになります。

  7. [Close] を選択します。

AWS SDK for Java

メッセージを受信したときに、削除するメッセージを指定して、Amazon SQS が返す受信ハンドルを提供するには。1 回のアクションで削除できるメッセージは 1 つだけです。キュー全体を削除するには、DeleteQueue アクションを使用する必要があります。(キューにメッセージが残っている場合でも、キュー全体を削除できます)。

注記

メッセージの受信ハンドルがわからない場合は、ReceiveMessage アクションをもう一度呼び出して、メッセージを再受信できます。メッセージを受信するたびに、受け取る受信ハンドルは変わります。DeleteMessage アクションを使用する場合は、最新の受信ハンドルを使用します。最新以外の受信ハンドルを使用すると、キューからメッセージが削除されない可能性があります。

サンプルコードでの作業を始める前に、AWS 認証情報を指定してください。詳細については、AWS SDK for Java Developer Guide開発用の AWS 認証情報とリージョンのセットアップを参照してください。

スタンダード キューからメッセージを受信し、削除するには

  1. プログラムの例をコピーします。

    コードの以下のセクションでは、キューからメッセージを受け取ります。

    // Receive messages System.out.println("Receiving messages from MyQueue.\n"); final ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); final List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); for (final Message message : messages) { System.out.println("Message"); System.out.println(" MessageId: " + message.getMessageId()); System.out.println(" ReceiptHandle: " + message.getReceiptHandle()); System.out.println(" MD5OfBody: " + message.getMD5OfBody()); System.out.println(" Body: " + message.getBody()); for (final Entry<String, String> entry : message.getAttributes().entrySet()) { System.out.println("Attribute"); System.out.println(" Name: " + entry.getKey()); System.out.println(" Value: " + entry.getValue()); } } System.out.println();

    コードの以下のセクションで、メッセージを削除します。

    // Delete the message System.out.println("Deleting a message.\n"); final String messageReceiptHandle = messages.get(0).getReceiptHandle(); sqs.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageReceiptHandle));
  2. コンパイルしてサンプルを実行します。

    キューはポーリングされ、0 件以上のメッセージを返します。このサンプルは、以下の項目を出力します。

    • キューにメッセージを送信したときに受信したメッセージ ID.

    • 後でメッセージを削除するときに使用する受信ハンドル

    • メッセージ本文のMD5ダイジェスト (詳細については、RFC1321 を参照)。

    • メッセージ本文.

    • Amazon SQS がリクエストに割り当てたリクエスト ID

    この呼び出しでメッセージが受信されない場合、レスポンスにはリクエスト ID のみが含まれます。

    メッセージが削除されました。レスポンスには Amazon SQS がリクエストに割り当てたリクエスト ID が含まれます。

FIFO キューからメッセージを受信し、削除するには

  1. プログラムの例をコピーします。

    コードの以下のセクションでは、キューからメッセージを受け取ります。

    // Receive messages System.out.println("Receiving messages from MyFifoQueue.fifo.\n"); final ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); // Uncomment the following to provide the ReceiveRequestDeduplicationId //receiveMessageRequest.setReceiveRequestAttemptId("1"); final List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); for (final Message message : messages) { System.out.println("Message"); System.out.println(" MessageId: " + message.getMessageId()); System.out.println(" ReceiptHandle: " + message.getReceiptHandle()); System.out.println(" MD5OfBody: " + message.getMD5OfBody()); System.out.println(" Body: " + message.getBody()); for (final Entry<String, String> entry : message.getAttributes().entrySet()) { System.out.println("Attribute"); System.out.println(" Name: " + entry.getKey()); System.out.println(" Value: " + entry.getValue()); } } System.out.println();

    コードの以下のセクションで、メッセージを削除します。

    // Delete the message System.out.println("Deleting the message.\n"); final String messageReceiptHandle = messages.get(0).getReceiptHandle(); sqs.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageReceiptHandle));
  2. コンパイルしてサンプルを実行します。

    メッセージが受信され削除されます。