Amazon Simple Queue Service
開発者ガイド

チュートリアル: Amazon SQS キューにロングポーリングを設定する

ロングポーリングは、空のレスポンス (ReceiveMessage リクエストに対して使用できるメッセージがない場合) と、偽の空のレスポンス (メッセージが利用できるがレスポンスに含まれていない場合) の数を削減することで、Amazon SQS の使用コストを削減するために役立ちます。 このチュートリアルでは、Amazon SQS キューのロングポーリングを設定する方法について説明します。詳細については、「Amazon SQS ロングポーリング」を参照してください。

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

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

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

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

    注記

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

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

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

  6. [メッセージ受信待機時間] に 120 の数を入力します。

    注記

    この値を 0 に設定すると、ショートポーリングが設定されます。詳細については、「ロングポーリングとショートポーリングの違い」を参照してください。

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

    ロングポーリングを使用するように設定された新しいキューが作成され、キューの一覧で選択されます。

    注記

    キューを作成しても、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>

SQSLongPollingExample.java

以下の Java コード例では、スタンダード キューが作成され、ロングポーリングがそのキューに設定されます。

/* * 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.CreateQueueRequest; import com.amazonaws.services.sqs.model.QueueAttributeName; import java.util.Scanner; public class SQSLongPollingExample { 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 ReceiveMessage wait time (1-20 seconds): "); final String receiveMessageWaitTime = 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 with long polling. final CreateQueueRequest createQueueRequest = new CreateQueueRequest() .withQueueName(queueName) .addAttributesEntry(QueueAttributeName.ReceiveMessageWaitTimeSeconds .toString(), receiveMessageWaitTime); sqs.createQueue(createQueueRequest); System.out.println("Created queue " + queueName + " with " + "ReceiveMessage wait time set to " + receiveMessageWaitTime + " 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 を取得する:

    final String queueUrl = sqs.getQueueUrl(queueName).getQueueUrl();
  3. 既存のキューにロングポーリングを設定するには、SetQueueAttributesRequest アクションを使用します。

    final SetQueueAttributesRequest setQueueAttributesRequest = new SetQueueAttributesRequest() .withQueueUrl(queueUrl) .addAttributesEntry("ReceiveMessageWaitTimeSeconds", "20"); sqs.setQueueAttributes(setQueueAttributesRequest);
  4. メッセージ受信にロングポーリングを設定するには、ReceiveMessageRequest アクションを使用します。

    final ReceiveMessageRequest receive_request = new ReceiveMessageRequest() .withQueueUrl(queueUrl) .withWaitTimeSeconds(20); sqs.receiveMessage(receive_request);
  5. プログラムをコンパイルして実行します。

    キューのロングポーリングを設定し、メッセージを送信、受信、削除できます。