Amazon Simple Queue Service
開発者ガイド

チュートリアル: 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 認証情報を指定してください。詳細については、AWS SDK for Java Developer Guide開発用の AWS 認証情報とリージョンのセットアップを参照してください。

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

前提条件

aws-java-sdk-sqs.jar パッケージを Java クラスパスに追加します。次の例では、この依存関係を Maven プロジェクトの pom.xml ファイルで示しています。

<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-sqs</artifactId> <version><replaceable>LATEST</replaceable></version> </dependency> </dependencies>

SQSVisibilityTimeoutExample.java

次の 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. プログラムをコンパイルして実行します。

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