Amazon Simple Queue Service
開発者ガイド

チュートリアル: Amazon SQS デッドレターキューを設定する

デッドレターキューは、正常に処理 (消費) できないメッセージの送信先として他の (ソース) キューが使用できるキューです。このチュートリアルでは、Amazon SQS ソースキューを作成し、2 つめのキューをデッドレターキューとして設定する方法を示します。詳細については、「Amazon SQS デッドレターキュー」を参照してください。

重要

このチュートリアルでは、MyDeadLetterQueue.fifo という名前の正常な FIFO キューが存在することを前提としています。

FIFO キューのデッドレターキューは、FIFO キューでもある必要があります。同様に、スタンダード キューのデッドレターキューは、スタンダード キューでもある必要があります。

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

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

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

  3. [Create New Queue] ページで、正しいリージョンにいることを確認してから、[Queue Name] を入力します。

    注記

    FIFO キューの名前は .fifo サフィックスで終わる必要があります。 FIFO キューは、米国東部(バージニア北部)、米国東部 (オハイオ)、米国西部 (オレゴン)、および 欧州 (アイルランド) リージョンで使用できます。

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

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

  6. この例では、新しいキューの Redrive ポリシーを有効にして、MyDeadLetterQueue.fifo キューをデッドレターキューとして設定し、最大受信数を 50 に設定します。

    デッドレターキューを設定するには、[Use Redrive Policy] を選択します。

    ソースキューからメッセージを送信する先の既存のデッドレターキューの名前を入力します。

    デッドレターキューに送信されるまでにメッセージを受信できる最大回数を設定するには、[Maximum Receives] を 1 ~ 1,000 の値に設定します。

    注記

    [Maximum Receives] 設定は、個々のメッセージのみに適用されます。

    [Create Queue] を選択します。

    新しいキューは、デッドレターキューを使用するように設定され、作成されてキューの一覧で選択されます。

    注記

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

    キューの [Maximum Receives] および [Dead Letter Queue] の ARN は [Redrive Policy] タブに表示されます。

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>

SQSDeadLetterQueueExample.java

次の Java コード例では、スタンダード キューを 2 つ作成し、一方をソースキューとして、もう一方をデッドレターキューとして動作するよう設定します。

/* * Copyright 2010-2018 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.GetQueueAttributesRequest; import com.amazonaws.services.sqs.model.GetQueueAttributesResult; import com.amazonaws.services.sqs.model.QueueAttributeName; import com.amazonaws.services.sqs.model.SetQueueAttributesRequest; import java.util.Scanner; public class SQSDeadLetterQueueExample { public static void main(String[] args) { final Scanner input = new Scanner(System.in); System.out.print("Enter the source queue name: "); final String sourceQueueName = input.nextLine(); System.out.print("Enter the dead-letter queue name: "); final String deadLetterQueueName = 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 source queue. sqs.createQueue(sourceQueueName); // Create a dead-letter queue. sqs.createQueue(deadLetterQueueName); // Get the dead-letter queue ARN. final String deadLetterQueueUrl = sqs.getQueueUrl(deadLetterQueueName) .getQueueUrl(); final GetQueueAttributesResult deadLetterQueueAttributes = sqs.getQueueAttributes( new GetQueueAttributesRequest(deadLetterQueueUrl) .withAttributeNames("QueueArn")); final String deadLetterQueueArn = deadLetterQueueAttributes.getAttributes().get("QueueArn"); // Set the dead letter queue for the source queue using the redrive policy. final String sourceQueueUrl = sqs.getQueueUrl(sourceQueueName) .getQueueUrl(); final SetQueueAttributesRequest request = new SetQueueAttributesRequest() .withQueueUrl(sourceQueueUrl) .addAttributesEntry(QueueAttributeName.RedrivePolicy.toString(), "{\"maxReceiveCount\":\"5\", \"deadLetterTargetArn\":\"" + deadLetterQueueArn + "\"}"); sqs.setQueueAttributes(request); System.out.println("Set queue " + sourceQueueName + " as source queue " + "for dead-letter queue " + deadLetterQueueName + "."); } 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. JSON 形式のパラメータと RedrivePolicy キュー属性の値を含む文字列を設定します。

    final String redrivePolicy = "{\"maxReceiveCount\":\"5\", \"deadLetterTargetArn\":\"arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue\"}";
  3. CreateQueue アクション、または SetQueueAttributesRequest アクションを使用して、キュー属性 RedrivePolicy を設定します。

    final SetQueueAttributesRequest queueAttributes = new SetQueueAttributesRequest(); final Map<String,String> attributes = new HashMap<String,String>(); attributes.put("RedrivePolicy", redrivePolicy); queueAttributes.setAttributes(attributes); queueAttributes.setQueueUrl(myQueueUrl); sqs.setQueueAttributes(queueAttributes);
  4. プログラムをコンパイルして実行します。

    デッドレターキューを設定し、メッセージを送信、受信、削除できます。