Cron for Java 8 を使用してタスクのスケジュールを設定する

App Engine Cron サービスを使用すると、定義された時刻または一定間隔で動作する定期スケジュール タスクを構成できます。このようなタスクは、一般的に cron ジョブと呼ばれています。cron ジョブは App Engine Cron サービスによって自動的にトリガーされます。たとえば cron ジョブを使用して、レポートメールを毎日送信したり、キャッシュ データを 10 分ごとに更新したり、概要情報を 1 時間に 1 回更新したりすることができます。

cron ジョブは、スケジュールされたとおりに URL に対して HTTP GET リクエストを行います。その URL のハンドラは、呼び出されたときにロジックを実行します。cron ジョブ リクエストには、push タスクキューと同じ制限が適用されます。

始める前に

スケジュールをデプロイまたは更新するには、アカウントに次のいずれかの IAM 役割が必要です。

  • オーナー
  • 編集者

Google Cloud Platform Console の IAM ページで権限を設定できます。

cron ジョブを作成する

  1. アプリケーションの WEB-INF/ ディレクトリ(appengine-web.xml がある場所)に cron.xml ファイルを作成します。
  2. 1 つ以上の <cron> エントリをファイルに追加し、ジョブに必要な要素(必須の <url> 要素や <schedule> 要素など)を定義します。

    次の例では、毎日 1 回実行される基本的な cron ジョブを作成しています。

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries>
      <cron>
        <url>/tasks/summary</url>
        <target>beta</target>
        <description>daily summary job</description>
        <schedule>every 24 hours</schedule>
      </cron>
    </cronentries>
    

    target の指定はオプションです。ここではサービス / バージョンの名前を指定します。target の指定がある場合、この文字列がアプリのホスト名の先頭に追加され、ジョブがそのサービス / バージョンにルーティングされるようになります。target が指定されていない場合、トラフィックに構成されている default サービスのバージョンでジョブが実行されます。

  3. cron ジョブの URL のハンドラを作成します。このハンドラはスケジュール設定されたすべてのタスクを実行します。成功した場合、ハンドラは 200~299 の値の HTTP ステータス コードを返します。他のステータス コードが返された場合は、そのコードを使用して cron ジョブを再試行できます。

ハンドラは、アプリ内のサーブレットと同じくらいシンプルにできます。web.xml でのサーブレット URL マッピングは cron ジョブの URL と同じにする必要があります。 cron.xml の構文とオプションの詳細については、こちらをご覧ください

開発サーバーで cron ジョブをテストする

ローカルの開発用サーバーでは、cron ジョブは自動的には実行されません。機能をテストするには、cron ジョブの URL に対して直接リクエストを行います。ローカルの cron やスケジュールされたタスクのインターフェースを使用すると、curl や同様のツールでジョブの URL をトリガーできます。

失敗した cron ジョブを再試行する

cron ジョブのリクエスト ハンドラが 200~299 の範囲にないステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、503 のステータス コードが返されない限り、失敗したジョブは再試行されません。この場合、成功する、つまり 200~299 のステータス コードが返されるまで 1 分ごとに再試行されます。

失敗したジョブを再試行するよう設定する手順は次のとおりです。

  1. cron.xml ファイルに retry-parameters ブロックを追加します。
  2. retry-parameters ブロックで、再試行パラメータを選択して設定します。

    たとえば、以下の cron.xml ファイルの例には 1 つの cron ジョブがあります。このジョブは再試行を最大で 5 回(デフォルト)実行するよう構成されています。バックオフの初期値は 2.5 秒で、試行ごとに 2 倍になります。

    <cronentries>
      <cron>
        <url>/retry</url>
        <description>Retry on jsdk</description>
        <schedule>every 10 minutes</schedule>
        <retry-parameters>
          <min-backoff-seconds>2.5</min-backoff-seconds>
          <max-doublings>5</max-doublings>
        </retry-parameters>
      </cron>
    </cronentries>
    

cron の再試行オプションの詳細については、こちらをご覧ください

cron ジョブのデプロイ

オプション 1: アプリケーション全体をアップロードする

アプリケーション全体をアップロードすると、cron.xml ファイルのエントリにより Cron サービスが更新されます。この処理を行うには、次のコマンドを実行します。

./appengine-java-sdk/bin/appcfg.sh -A your-app-id -V app-version update [YOUR_APP_DIR]
オプション 2: cron の更新分のみをアップロードする

cron の構成だけを更新し、アプリケーションの残りの部分はアップロードしない場合には、次のコマンドを実行します。

./appengine-java-sdk/bin/appcfg.sh -A your-app-id -V app-version update_cron [YOUR_APP_DIR]

すべての cron ジョブを削除する

すべての cron ジョブを削除するには:

  1. cron.xml ファイルの内容を、次のように編集します。

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries/>
    
  2. cron.xml ファイルを App Engine にデプロイします。

cron 用 URL を保護する

スケジュールされたタスクで使用する URL にユーザーがアクセスできないようにするには、アクセスを管理者アカウントに限定します。スケジュールされたタスクは、管理者専用の URL にアクセスできます。URL の制限について詳しくは、セキュリティと認証をご覧ください。/cron/ で始まるすべての URL を管理者専用に制限する際に web.xml で使用できる例を以下に示します。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>cron</web-resource-name>
        <url-pattern>/cron/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

web.xml の形式について詳しくは、デプロイ記述子に関するドキュメントをご覧ください。

cron ジョブをテストするには、管理者としてログインし、ブラウザでハンドラの URL にアクセスします。

cron サービスからのリクエストには、次の HTTP ヘッダーも含まれます。

X-Appengine-Cron: true

この X-Appengine-Cron ヘッダーは Google App Engine 内部で設定されます。リクエスト ハンドラがこのヘッダーを検出した場合、そのリクエストが cron リクエストであると判断できます。アプリケーションへの外部ユーザー リクエストにこのヘッダーが含まれる場合は、削除されます。ただしログイン済みのアプリケーション管理者からのリクエストは例外で、テストの目的でこのヘッダーを設定することを許可されます。

Google App Engine は Cron リクエストを IP アドレス 0.1.0.1 から発行します。

Google Cloud Endpoints を呼び出す

cron ジョブの url フィールドに Google Cloud Endpoints を指定することはできません。cron ジョブで Google Cloud Endpoints を呼び出せるようにするには、アプリのハンドラで提供されるターゲットへのリクエストを発行し、エンドポイントのクラスとメソッドをハンドラコードから呼び出します。

GCP Console で cron ジョブを表示する

スケジュールされた cron ジョブは、GCP Console の [cron ジョブ] ページで確認できます。

cron ジョブが追加または削除された時期を確認するために、ログを表示することもできます。

詳細

cron ジョブの定義の詳細については、cron.xml リファレンスをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Java 8 の App Engine スタンダード環境