Aufgaben mit Cron für Java 8 planen

Mit dem Cron-Dienst von App Engine können Sie regelmäßig geplante Aufgaben konfigurieren, die zu bestimmten Zeiten oder in regelmäßigen Abständen ausgeführt werden. Diese Aufgaben werden allgemein als Cronjobs bezeichnet. Cronjobs werden vom App Engine-Cron-Dienst automatisch ausgelöst. Sie können einen Cronjob beispielsweise nutzen, um täglich einen E-Mail-Bericht zu senden, alle 10 Minuten Daten im Cache oder einmal pro Stunde bestimmte zusammenfassende Informationen zu aktualisieren.

Ein Cronjob stellt gemäß seinem Zeitplan eine HTTP-GET-Anfrage an eine URL. Beim Aufruf führt der Handler für diese URL die Logik aus. Für eine Cronjob-Anfrage gelten die gleichen Einschränkungen wie für Push-Aufgabenwarteschlangen.

Hinweis

Zum Bereitstellen oder Aktualisieren von Zeitplänen benötigt Ihr Konto eine der folgenden IAM-Rollen:

  • Inhaber
  • Editor

Sie können die Berechtigung in der Google Cloud Console auf der Seite „IAM“ festlegen.

Cronjob erstellen

  1. Erstellen Sie die Datei cron.xml im Verzeichnis WEB-INF/ Ihrer Anwendung (zusätzlich zur Datei appengine-web.xml).
  2. Fügen Sie einen oder mehrere <cron>-Einträge in die Datei ein und definieren Sie die erforderlichen Elemente für den Job, einschließlich der erforderlichen <url>- und <schedule>-Elemente.

    Im folgenden Beispiel wird ein einfacher Cronjob zur täglichen Ausführung erstellt:

    <?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>
    

    Die Angabe des Ziels (Name eines Diensts oder einer Version) ist optional. Falls vorhanden, wird das Ziel dem Hostnamen der Anwendung vorangestellt, wodurch der Job an diesen Dienst oder diese Version weitergeleitet wird. Wenn kein Ziel angegeben ist, wird der Job in den Versionen des default-Dienstes ausgeführt, die für den Traffic konfiguriert sind.

  3. Erstellen Sie einen Handler für die Cronjob-URL. Der Handler sollte alle Aufgaben ausführen, die Sie planen möchten. Bei erfolgreicher Ausführung sollte der Handler als Antwort einen HTTP-Statuscode zwischen 200 und 299 (einschließlich) zurückgeben. Es können auch andere Statuscodes zurückgegeben und für die nochmalige Ausführung des Cronjobs verwendet werden.

Der Handler kann so einfach gestaltet sein wie ein Servlet in der Anwendung. Die Servlet-URL-Zuordnung in web.xml sollte mit der Cronjob-URL übereinstimmen. Weitere Informationen finden Sie auf der Seite zu Syntax und Optionen von cron.yaml.

Cronjobs im Entwicklungsserver testen

Cronjobs werden auf dem lokalen Entwicklungsserver nicht automatisch ausgeführt. Sie können Anfragen direkt an die URL eines Cronjobs senden, um die Funktionalität zu testen. Über Ihre lokale Oberfläche für Cronjobs oder geplante Aufgaben können Sie die URLs Ihrer Jobs mit curl oder einem ähnlichen Tool auslösen.

Fehlgeschlagene Cronjobs wiederholen

Wenn der Anfrage-Handler eines Cronjobs einen Statuscode zurückgibt, der nicht im Bereich von 200 bis 299 (einschließlich) liegt, betrachtet App Engine den Job als fehlgeschlagen. Fehlgeschlagene Jobs werden standardmäßig nur dann wiederholt, wenn der Statuscode 503 zurückgegeben wird. In diesem Fall wird der jeweilige Job jede Minute wiederholt, bis er erfolgreich ist oder einen der Statuscodes von 200 bis 299 zurückgibt.

So legen Sie fest, dass fehlgeschlagene Jobs wiederholt werden:

  1. Nehmen Sie in Ihre cron.xml-Datei den Block retry-parameters auf.
  2. Geben Sie im retry-parameters-Block die Wiederholungsparameter an und legen Sie dafür Werte fest.

    Die Datei cron.xml in diesem Beispiel enthält einen einzelnen Cronjob, der so konfiguriert ist, dass er bis zu fünfmal (Standard) wiederholt wird, wobei ein Start-Backoff von 2,5 Sekunden vorgesehen ist, der sich jedes Mal verdoppelt.

    <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>
    

Weitere Informationen zu den Wiederholungsoptionen für Cronjobs

Cronjobs bereitstellen

Option 1: Gesamte Anwendung hochladen

Führen Sie den folgenden Befehl aus, um Ihre gesamte Anwendung hochzuladen, wobei auch der Cron-Dienst mit den Einträgen aus der Datei cron.xml aktualisiert wird:

./appengine-java-sdk/bin/appcfg.sh -A your-app-id -V app-version update [YOUR_APP_DIR]
Option 2: Nur Cron-Aktualisierungen hochladen

Führen Sie den folgenden Befehl aus, um nur die Cron-Konfiguration zu aktualisieren, ohne die übrige Anwendung hochzuladen:

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

Alle Cronjobs löschen

So löschen Sie alle Cronjobs:

  1. Bearbeiten Sie den Inhalt der Datei cron.xml so:

    <?xml version="1.0" encoding="UTF-8"?>
    <cronentries/>
    
  2. Stellen Sie die Datei cron.xml in App Engine bereit.

URLs für Cron sichern

Wenn Sie nicht möchten, dass Nutzer auf URLs zugreifen, die von geplanten Aufgaben verwendet werden, können Sie den Zugriff auf Administratorkonten einschränken. Geplante Aufgaben können auf URLs für Administratoren zugreifen. Weitere Informationen zum Einschränken von URLs finden Sie unter Sicherheit und Authentifizierung. Ein Beispiel, das Sie in web.xml verwenden würden, um alle URLs beginnend mit /cron/ auf Administratoren zu beschränken, ist Folgendes:

<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>

Weitere Informationen zum Format von web.xml finden Sie in der Dokumentation zum Bereitstellungsdeskriptor.

Melden Sie sich zum Testen eines Cronjobs als Administrator an und rufen Sie in Ihrem Browser die URL des Handlers auf.

Anfragen vom Cron-Dienst enthalten auch einen HTTP-Header:

X-Appengine-Cron: true

Der Header X-Appengine-Cron wird intern von Google App Engine festgelegt. Wenn Ihr Anfrage-Handler diesen Header findet, kann er sich darauf verlassen, dass es sich bei der Anfrage um eine Cron-Anfrage handelt. Wenn der Header in einer externen Nutzeranfrage an Ihre Anwendung vorhanden ist, wird er entfernt. Eine Ausnahme sind Anfragen von angemeldeten Administratoren der Anwendung, die den Header für Testzwecke festlegen dürfen.

Google App Engine gibt Cron-Anfragen über die IP-Adresse 0.1.0.1 aus.

Google Cloud Endpoints aufrufen

Sie können im Feld url eines Cronjobs keinen Google Cloud Endpoint angeben. Wenn mit dem Cronjob ein Google Cloud Endpoint aufgerufen werden soll, senden Sie eine Anfrage an ein Ziel, das von einem Handler in Ihrer Anwendung bereitgestellt wird, und rufen Sie die Endpoint-Klasse und -Methode über den Handler-Code auf.

Cronjobs in der Cloud Console ansehen

Sie können geplante Cronjobs in der Cloud Console auf der Seite „Cronjobs“ prüfen.

Sie können auch Logs aufrufen, um zu sehen, wann Cronjobs hinzugefügt oder entfernt wurden.

Weitere Informationen

Ausführliche Informationen zum Definieren von Cronjobs finden Sie in der Referenz zu cron.xml.