リージョン ID
REGION_ID
は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r
は App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。
詳しくは、リージョン ID をご覧ください。
Pub/Sub は、信頼できる多対多の非同期メッセージングをアプリケーション間で行います。パブリッシャー アプリケーションはメッセージをトピックに送信し、その他のアプリケーションはそのトピックにサブスクライブしてメッセージを受信できます。
このドキュメントでは、Cloud クライアント ライブラリを使用して Java 8 アプリで Pub/Sub メッセージを送受信する方法を説明します。
前提条件
- App Engine の Java 8 用「Hello, World!」の説明に沿って環境とプロジェクトを設定し、App Engine での Java 8 アプリの構造を理解します。
- このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID を書き留めておきます。
サンプルアプリのクローン作成
サンプルアプリをローカルマシンにコピーし、pubsub
ディレクトリに移動します。
git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/appengine-java8/pubsub
トピックとサブスクリプションの作成
トピックとサブスクリプションを作成します。Pub/Sub サーバーがリクエストを送信するエンドポイントも指定します。
bv # Configure the topic gcloud pubsub topics create YOUR_TOPIC_NAME # Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10
YOUR_TOKEN
は、ランダムなシークレット トークンで置き換えます。push エンドポイントがこれを使用してリクエストを検証します。
Pub/Sub を認証で使用するには、別のサブスクリプションを作成します。
# Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\ --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10 # Your Google-managed service account # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'`YOUR-SERVICE-ACCOUNT-EMAIL` は、[サービス アカウント](/appengine/docs/flexible/configure-service-accounts)のメールアドレスに置き換えます。### 環境変数の設定 {: edit_appyaml} `appengine-web.xml` ファイルを編集して、トピックと確認トークンの各環境変数を設定します。 ## コードレビュー サンプルアプリは、[クラウド クライアント ライブラリ](https://googleapis.dev/java/google-cloud-clients/latest/index.html){: class="external"} を使用します。このサンプルアプリでは、`appengine-web.xml` ファイルに設定された値を使用して環境変数を構成します。push リクエスト ハンドラは、これらの値を使用して、リクエストが Pub/Sub からのものであり、信頼できる送信元から送信されていることを確認します。 String pubsubVerificationToken = System.getenv("PUBSUB_VERIFICATION_TOKEN"); このサンプルアプリでは、メッセージを格納する Cloud Datastore データベース インスタンスを保守します。PubSubPush サーブレットはプッシュされたメッセージを受け取り、messageRepository データベース インスタンスに追加します。 PubSubPublish サーブレットは、App Engine ウェブアプリと連携して新しいメッセージを公開し、受信したメッセージを表示します。 ## サンプルをローカルで実行する {: #run_the_sample_locally} ローカルで実行する場合、Google Cloud API を使用するための認証を Google Cloud CLI を使用して行えます。[前提条件](#prerequisites)に記載されているとおりに環境を設定していれば、この認証を行う `gcloud init` コマンドはすでに実行されています。mvn clean package 次に、アプリケーションを開始する前に環境変数を次のように設定します。 export PUBSUB_VERIFICATION_TOKEN=[your-verification-token] export PUBSUB_TOPIC=[your-topic] mvn appengine:run ### プッシュ通知のシミュレーション {: simulate_push_notifications} アプリケーションはローカルでメッセージを送信できますが、プッシュ メッセージをローカルで受信できません。push メッセージをシミュレートするには、ローカルのプッシュ通知エンドポイントに HTTP リクエストを送信します。このサンプルには、`sample_message.json` が含まれています。 `curl` または [`httpie`](https://github.com/jkbrzt/httpie){: class="external"} クライアントを使用して、次のように HTTP `POST` リクエストを送信できます。 curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]" または http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json レスポンス: HTTP/1.1 200 OK Date: Wed, 26 Apr 2017 00:03:28 GMT Content-Length: 0 Server: Jetty(9.3.8.v20160314) リクエストが完了したら、`localhost:8080` を更新して受信したメッセージのリストでメッセージを確認できます。## App Engine での実行 {: #run_on_app_engine} `gcloud` コマンドライン ツールを使用してデモアプリを App Engine にデプロイするには、`pom.xml` が配置されているディレクトリから次のコマンドを実行します。
mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID
PROJECT_ID は、Google Cloud プロジェクトの ID に置き換えます。pom.xml
ファイルですでにプロジェクト ID を指定している場合は、実行するコマンドに -Dapp.deploy.projectId
プロパティを含める必要はありません。
これで、https://PROJECT_ID.REGION_ID.r.appspot.com
のアプリケーションにアクセスできます。フォームを使用してメッセージを送信できますが、アプリケーションのどのインスタンスが通知を受信するかはわかりません。複数のメッセージを送信してページを更新すると、受信メッセージを確認できます。