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

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

cron ジョブは、HTTP GET リクエストを使用して、決められた時刻に URL を呼び出します。 cron ジョブ リクエストには、push タスクキューと同じ制限が適用されます。

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.xml の構文とパラメータについて詳しくは、cron.xml リファレンスをご覧ください。

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

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

cron ジョブをアップロードする

appcfg.sh ツールを使用して、cron ジョブを App Engine にアップロードできます。

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

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

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

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

./appengine-java-sdk/bin/appcfg.sh update_cron [YOUR_APP_DIR]

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

すべての cron ジョブを削除する手順は次のとおりです。

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

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries/>
    

  2. cron.xml ファイルを App Engine にアップロードします

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

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

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

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

    たとえば、以下の 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 用 URL を保護する

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

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

Cloud Platform Console で cron ジョブを表示する

Cloud Platform Console の [タスクキュー] ページには、cron ジョブを実行するタスクを表示するタブがあります。

また、[ログ] ページでは、cron ジョブがいつ追加または削除されたかを確認できます。

外出先でもリソースをモニタリング

Google Cloud Console アプリを入手して、プロジェクトの管理にお役立てください。

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

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