チュートリアル: Amazon SQS キューに可視性タイムアウトを設定する - Amazon Simple Queue Service

チュートリアル: Amazon SQS キューに可視性タイムアウトを設定する

メッセージが受信された直後は、メッセージはキューに残ったままです。他のコンシューマーが同じメッセージを再処理しないように、Amazon SQS は可視性タイムアウトを設定しています。Amazon SQS では、この時間内に他のコンシューマーが同じメッセージを受信したり処理したりすることはできません。メッセージのデフォルトの可視性タイムアウトは 30 秒です。最小値は 0 秒、最大スケールは 12 時間です。 このチュートリアルでは、AWS マネジメントコンソール を使用してキューに可視性タイムアウトを設定する方法、AWS SDK for Java を使用して単一または複数のメッセージの可視性タイムアウトを設定する方法を学習します。詳細については、「Amazon SQS可視性タイムアウト」を参照してください。

注記

キューにのみ可視性タイムアウトを設定するには、AWS マネジメントコンソール を使用します。単一または複数のメッセージには設定できません。そのためには、AWS SDK のいずれかを使用します。詳細については、以下の 2 つめの Java コード例を参照してください。

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

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

  2. [新しいキューの作成] を選択します。

  3. [新しいキューの作成] ページで、正しいリージョンにいることを確認してから、[キュー名] を入力します。

    注記

    FIFO キューの名前は .fifo サフィックスで終わる必要があります。

  4. [スタンダード] がデフォルトで選択されます。[FIFO] を選択します。

  5. [Configure Queue] を選択します。

  6. この例では、デフォルトの可視性タイムアウトを 1 分に設定します。

  7. [Create Queue] を選択します。

    1 分の可視性タイムアウトを使用するように設定された新しいキューが作成され、キューの一覧で選択されます。

    注記

    キューを作成しても、Amazon SQS 全体に周知されるまで少し時間がかかることがあります。

    キューの [デフォルト可視性タイムアウト] が [詳細] タブに表示されます。

AWS SDK for Java

次の例では、AWS Java SDK を使用しています。SDK のインストールとセットアップについては、AWS SDK for Java Developer Guideの「AWS SDK for Java のセットアップ」を参照してください。

サンプルコードを実行する前に、AWS の認証情報を設定します。詳細については、『AWS SDK for Java Developer Guide』の「開発用の AWS 認証情報とリージョンのセットアップ」を参照してください。

キューに可視性タイムアウトを設定するには

次の Java コード例では、スタンダード キューを作成し、可視性タイムアウトを 1 分に設定します。

/* * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * https://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. * */ import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.AmazonSQSClientBuilder; import com.amazonaws.services.sqs.model.CreateQueueRequest; import com.amazonaws.services.sqs.model.QueueAttributeName; import com.amazonaws.services.sqs.model.SetQueueAttributesRequest; import java.util.Scanner; public class SQSVisibilityTimeoutExample { public static void main(String[] args) { final Scanner input = new Scanner(System.in); System.out.print("Enter the queue name: "); final String queueName = input.nextLine(); System.out.print("Enter the visibility timeout in seconds " + "(0 seconds to 12 hours): "); final String visibilityTimeout = input.nextLine(); /* * Create a new instance of the builder with all defaults (credentials * and region) set automatically. For more information, see * Creating Service Clients in the AWS SDK for Java Developer Guide. */ final AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient(); try { // Create a queue. final CreateQueueRequest createQueueRequest = new CreateQueueRequest() .withQueueName(queueName); sqs.createQueue(createQueueRequest); // Set the visibility timeout for the queue. final String queueUrl = sqs.getQueueUrl(queueName) .getQueueUrl(); final SetQueueAttributesRequest request = new SetQueueAttributesRequest() .withQueueUrl(queueUrl) .addAttributesEntry(QueueAttributeName.VisibilityTimeout .toString(), visibilityTimeout); sqs.setQueueAttributes(request); System.out.println("Created queue " + queueName + " with " + "visibility timeout set to " + visibilityTimeout + " seconds."); } catch (final AmazonServiceException ase) { System.out.println("Caught an AmazonServiceException, which means " + "your request made it to Amazon SQS, but was " + "rejected with an error response for some reason."); System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); } catch (final AmazonClientException ace) { System.out.println("Caught an AmazonClientException, which means " + "the client encountered a serious internal problem while " + "trying to communicate with Amazon SQS, such as not " + "being able to access the network."); System.out.println("Error Message: " + ace.getMessage()); } } }

単一または複数のメッセージの可視性タイムアウトを設定し、メッセージの送受信および削除を行うには

  1. スタンダード キューまたは FIFO キューのプログラム例をコピーします。

  2. 単一メッセージの可視性タイムアウトを設定するには、キュー URL、メッセージの受信ハンドル、可視性タイムアウト値 (秒) を渡します。

    // Get the message receipt handle. String receiptHandle = sqs.receiveMessage(myQueueUrl) .getMessages() .get(0) .getReceiptHandle(); // Pass the queue URL, the message receipt handle, and the visibility timeout value. sqs.changeMessageVisibility(myQueueUrl, receiptHandle, timeoutValue);
  3. 複数メッセージの可視性タイムアウトを設定する (例: メッセージごとに異なるタイムアウト値を設定する) には、ArrayList を作成して、可視性タイムアウト (秒) を設定したメッセージを追加し、メッセージのキュー URL および ArrayList を渡します。

    // Create an ArrayList for batched messages. List<ChangeMessageVisibilityBatchRequestEntry> entries = new ArrayList<ChangeMessageVisibilityBatchRequestEntry>(); // Add the first message to the ArrayList with a visibility timeout value. entries.add(new ChangeMessageVisibilityBatchRequestEntry( "uniqueMessageId123", sqs.receiveMessage(myQueueUrl) .getMessages() .get(0) .getReceiptHandle()) .withVisibilityTimeout(timeoutValue)); // Add the second message to the ArrayList with a different timeout value. entries.add(new ChangeMessageVisibilityBatchRequestEntry( "uniqueMessageId456", sqs.receiveMessage(myQueueUrl) .getMessages() .get(0) .getReceiptHandle()) .withVisibilityTimeout(timeoutValue + 60)); sqs.changeMessageVisibilityBatch(myQueueUrl, entries);
  4. プログラムをコンパイルして実行します。

    単一または複数のメッセージの可視性タイムアウトを設定し、メッセージを送信、受信、削除できます。