Pianificazione delle attività con Cron per Java 8 (basata sulla CLI gcloud)

Il servizio cron di App Engine consente di configurare attività programmate regolarmente che vengono eseguite a orari definiti o a intervalli regolari. Queste attività sono comunemente note come cron job. Questi cron job vengono attivati automaticamente dal servizio cron di App Engine. Ad esempio, puoi utilizzare un cron job per inviare un report via email ogni giorno, aggiornare alcuni dati memorizzati nella cache ogni 10 minuti o aggiornare le informazioni di riepilogo una volta all'ora.

Un cron job effettua una richiesta HTTP GET pianificata all'endpoint specificato nella stessa app in cui è configurato il cron job. Il gestore per l'endpoint esegue la logica quando viene chiamato.

Il servizio cron di App Engine non può essere utilizzato per chiamare endpoint web al di fuori dell'app host di App Engine. Non può essere utilizzato per chiamare endpoint App Engine da altre app oltre all'app host.

Una richiesta di job cron è soggetta agli stessi limiti delle code di attività push.

Prima di iniziare

Per eseguire il deployment o l'aggiornamento delle pianificazioni, il tuo account richiede uno dei seguenti ruoli IAM:

  • Proprietario
  • Editor

Puoi impostare l'autorizzazione nella pagina IAM della console Google Cloud .

Creazione di un cron job

  1. Crea il file cron.yaml nella directory principale dell'applicazione (accanto a app.yaml).
  2. Aggiungi una o più voci <cron> al file e definisci gli elementi necessari per il job, inclusi gli elementi obbligatori <url> e <schedule>. Consulta la sintassi e le opzioni di cron.yaml per ulteriori dettagli sugli elementi del file cron.yaml.

    L'esempio seguente crea un cron job di base che viene eseguito ogni giorno:

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    La specifica della destinazione è facoltativa e corrisponde al nome di un servizio/versione. Se presente, la destinazione viene anteposta al nome host dell'app, in modo che il job venga indirizzato a quel servizio/versione. Se non viene specificato alcun target, il job verrà eseguito nelle versioni del servizio default configurate per il traffico.

  3. Crea un gestore per l'URL del cron job. Il gestore deve eseguire tutte le attività che vuoi pianificare. Il gestore deve rispondere con un codice di stato HTTP compreso tra 200 e 299 (inclusi) per indicare l'esito positivo. Possono essere restituiti altri codici di stato e possono essere utilizzati per riprovare il job cron.

Il gestore può essere semplice come un servlet nell'app. Il mapping dell'URL del servlet in web.xml deve essere uguale all'URL del cron job.

Test dei cron job nel server di sviluppo

Il server di sviluppo locale non esegue automaticamente i job cron. Puoi inviare richieste direttamente all'URL del tuo cron job per testare la funzionalità. Puoi utilizzare l'interfaccia cron locale o delle attività pianificate per attivare gli URL dei tuoi job con curl o uno strumento simile.

Nuovo tentativo di esecuzione dei cron job non riusciti

Se il gestore di richieste di un job cron restituisce un codice di stato non compreso nell'intervallo 200-299 (incluso), App Engine considera il job non riuscito. Per impostazione predefinita, i job non riusciti non vengono ritentati a meno che non venga restituito un codice di stato 503, nel qual caso vengono ritentati ogni minuto finché non riescono o non restituiscono un codice di stato compreso tra 200 e 299.

Per impostare i job non riusciti in modo che vengano riprovati:

  1. Includi un blocco retry_parameters nel file cron.yaml.
  2. Scegli e imposta i parametri di ripetizione nel blocco retry_parameters.

    Ad esempio, questo file cron.yaml di esempio contiene un singolo job cron configurato per riprovare fino a cinque volte (il valore predefinito) con un backoff iniziale di 2,5 secondi che raddoppia ogni volta.

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

Scopri di più sulle opzioni di nuovo tentativo di cron.

Deployment dei cron job

Per eseguire il deployment dei cron job specificati nel file di configurazione cron.yaml, esegui questo comando:

gcloud

gcloud app deploy cron.yaml

Maven

mvn appengine:deployCron cron.yaml

Gradle

gradle appengineDeployCron cron.yaml

IDE

Se utilizzi IntelliJ, seleziona i singoli file di configurazione da implementare utilizzando il modulo di deployment.

Eliminazione di tutti i cron job

Per eliminare tutti i cron job:

  1. Modifica i contenuti del file cron.yaml in modo che siano:

    cron:
    
  2. Esegui il deployment del file cron.yaml in App Engine.

Protezione degli URL per cron

Un gestore cron è un normale gestore definito in app.yaml. Puoi impedire agli utenti di accedere agli URL utilizzati dalle attività pianificate limitando l'accesso agli account amministratore. Le attività pianificate possono accedere agli URL solo per amministratori. Puoi limitare un URL aggiungendo login: admin alla configurazione del gestore in app.yaml.

Un esempio potrebbe avere il seguente aspetto in app.yaml:

application: hello-cron
version: 1
runtime: java
api_version: 1

handlers:
- url: /report/weekly
  servlet: mysite.server.CronServlet
  login: admin

Per testare un cron job, accedi come amministratore e visita l'URL del gestore nel browser.

Le richieste del servizio Cron conterranno anche un'intestazione HTTP:

X-Appengine-Cron: true

L'intestazione X-Appengine-Cron è impostata internamente da App Engine. Se il gestore delle richieste trova questa intestazione, può considerare la richiesta come una richiesta cron. Se l'intestazione è presente in una richiesta di un utente esterno alla tua app, viene rimossa, ad eccezione delle richieste degli amministratori che hanno eseguito l'accesso all'applicazione, ai quali è consentito impostare l'intestazione a scopo di test.

App Engine invia richieste Cron dall'indirizzo IP 0.1.0.2. Per i cron job creati con versioni precedenti di gcloud (precedenti alla versione 326.0.0), le richieste cron provengono da 0.1.0.1.

Chiamata di Google Cloud Endpoints

Non puoi specificare un endpoint Google Cloud nel campo url di un job cron. Se vuoi che il tuo job cron chiami un endpoint Google Cloud, invia una richiesta a una destinazione gestita da un gestore nella tua app e chiama la classe e il metodo dell'endpoint dal codice del gestore.

Visualizzazione dei cron job nella console Google Cloud

Puoi visualizzare i cron job pianificati nella scheda Cron job di App Engine di Cloud Scheduler.

Puoi anche visualizzare i log per vedere quando sono stati aggiunti o rimossi i cron job.

Scopri di più

Consulta le informazioni dettagliate sulla definizione dei cron job nel riferimento cron.yaml.