JavaでAmazon SQSのメッセージを送受信するチュートリアル

投稿者 : OSCA

[PR] 関東地方の美しい夜景を観にいこう。 夜景サイト「夜景散歩」で夜景スポットを検索

本稿はフルマネージド型のメッセージキューイングサービス「Amazon SQS」を Java のプログラムから利用する方法について解説します。 なお、もしJavaで操作するよりも先にもっと基本から学びたいという方は、別項「Amazon SQSチュートリアル (AWS CLI で一連の操作をしてみよう)」を先に試して頂くと、より学びになるかと思いますので、ぜひご覧ください。

事前準備

Java のプログラムを書く前に、プログラム中で必要になることについて先に確認しておきましょう。

キューのURL

Amazon SQSでは、キューそれぞれにURLが払い出されます。 そのURLがプログラム中で必要になりますので、あらかじめ確認しておきましょう。 AWS Console で Amazon SQS のサービスを開き、利用するキューの詳細画面を開いてください。 下図のようにキューのURLを確認することができます。

1. クライアントライブラリ

Java から Amazon SQS へのアクセスには、AWS公式のクライアントライブラリ「aws-java-sdk-sqs」を利用することができます。 プロジェクトで Apache Maven を利用している場合は、依存ライブラリに次のように dependency を追加してください。

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-sqs</artifactId>
  <version>1.12.116</version>
</dependency>

または Gradle を利用している場合は、次のように記述を追加します。

implementation group: 'com.amazonaws', name: 'aws-java-sdk-sqs', version: '1.12.116'

なお、最新のバージョン番号はMaven Repositoryのサイトから確認してください。 これでクライアントライブラリの依存関係の追加は完了です。

2. SQSクライアントのインスタンス化

次に Amazon SQS にアクセスするためのクライアントクラス AmazonSQS をインスタンス化する方法について解説します。

2-1. プログラム中で認証情報を宣言する場合

Java のプログラム中でAWSへアクセスするための認証情報を宣言する場合は、次のようなコードになります。 AWSCredentials クラスを「アクセスキー」と「シークレットキー」の2つの情報からインスタンス化し、その認証情報を利用して AmazonSQS クラスをインスタンス化します。 次の例では認証情報と、利用する Amazon SQS のリージョンを指定してインスタンス化しています。

// AWSの認証情報
AWSCredentials credentials = new BasicAWSCredentials(
  "**your-aws-access-key-id**",
  "**your-aws-secret-access-key**"
);

// Amazon SQS のクライアントをインスタンス化
AmazonSQS client = AmazonSQSClientBuilder
  .standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentials))
  .withRegion(Regions.US_WEST_1)
  .build();

2-2. .aws/credentials の認証情報を利用する場合

プログラムを実行するコンピュータ内に認証情報が含まれるファイル .aws/credentials があり、その認証情報を利用する場合は、次のように簡単に AmazonSQS クラスをインスタンス化することもできます。

AmazonSQS client = AmazonSQSClientBuilder.defaultClient();

3. Amazon SQSのキューにメッセージを送信する

それでは、続いてキューにメッセージを送信する方法について解説します。 なおサンプルプログラムを簡易的にするため、 AmazonSQS クラスのインスタンス化は、上記の2-2の .aws/credentials の認証情報を利用することとします。

メッセージ「hello world」を送信するサンプルプログラムは以下の通りです。

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.SendMessageRequest;

public class SendMessageMain {
  public static void main(String args[]) {
    // Amazon SQS のクライアントをインスタンス化
    AmazonSQS client = AmazonSQSClientBuilder.defaultClient();

    // Amazon SQS のキューのURLを宣言
    String url = "<https://sqs.us-west-1.amazonaws.com/123456789012/sample-queue>";

    // Amazon SQS に送信するメッセージを宣言
    String message = "hello world";

    // メッセージ「hello world」を送信します
    SendMessageRequest request = new SendMessageRequest()
      .withQueueUrl(url)
      .withMessageBody(message)
      .withDelaySeconds(5);
    client.sendMessage(request);
  }
}

メッセージの送信リクエスト SendMessageRequest に、キューのURL、メッセージ、配信遅延秒数(遅延キュー機能を利用する場合)を指定して、 client.sendMessage() メソッドでメッセージを送信しています。

4. Amazon SQSのメッセージを受信/削除する

続いて Amazon SQS からメッセージを受信する方法について解説します。 メッセージを受信するサンプルプログラムは次の通りです。

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;

public class RecieveMessageMain {
  public static void main(String args[]) {
    // Amazon SQS のクライアントをインスタンス化
    AmazonSQS client = AmazonSQSClientBuilder.defaultClient();

    // Amazon SQS のキューのURLを宣言
    String url = "<https://sqs.us-west-1.amazonaws.com/123456789012/sample-queue>";

    // メッセージを受信する
    ReceiveMessageRequest request = new ReceiveMessageRequest()
      .withQueueUrl(url)
      .withWaitTimeSeconds(5)	     // ロングポーリングの時間を設定
      .withMaxNumberOfMessages(5); // 最大受信メッセージ数を設定
    ReceiveMessageResult result = client.receiveMessage(request);

    // 受信したメッセージの数だけの繰り返し
    for (Message msg : result.getMessages()) {
      // 受信したメッセージの情報を表示
      System.out.println("["+msg.getMessageId()+"]");
      System.out.println("  Message ID     : " + msg.getMessageId());
      System.out.println("  Receipt Handle : " + msg.getReceiptHandle());
      System.out.println("  Message Body   : " + msg.getBody());
      System.out.println();

      // 受信したメッセージを削除
      client.deleteMessage(url, msg.getReceiptHandle());
    }
  }
}

メッセージを受信するためのリクエスト ReceiveMessageRequest に、キューのURL, ロングポーリングの時間、最大受信メッセージ数を設定し、 client.recieveMessage() メソッドでメッセージを受信しています。

受信したメッセージを for 文で表示しつつ、受信しただけではキューからメッセージが削除されませんので、 client.deleteMessage() メソッドでキューからメッセージを削除しています。

おわりに

Amazon SQS へのメッセージの送信・受信・削除の方法について解説しました。 Amazon SQS はとてもシンプルなサービスであるため、あまり難しいことはありませんね。 本稿が皆様のお仕事の役に立てば幸いです。

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca