Referência do cron.xml para ferramentas baseadas no SDK do App Engine

Use o arquivo cron.yaml para definir tarefas programadas no seu aplicativo.

Para saber mais sobre como programar tarefas, incluindo instruções de teste, implantação ou exclusão de cron jobs, consulte Como programar tarefas com o Cron.

Exemplo

A seguir, um exemplo de arquivo cron.yaml:

cron:
- description: "daily summary job"
  url: /tasks/summary
  schedule: every 24 hours
- description: "monday morning mailout"
  url: /mail/weekly
  schedule: every monday 09:00
  timezone: Australia/NSW
- description: "new daily summary job"
  url: /tasks/summary
  schedule: every 24 hours
  target: beta

Sintaxe

É preciso que o arquivo cron.yaml resida no diretório raiz do aplicativo junto com app.yaml: cron.yaml configura tarefas programadas para o aplicativo em Java 8.

Definições de cron jobs

Elemento Descrição
description Opcional. A descrição está visível no Console do GCP e na interface de administração do servidor de desenvolvimento.
retry_parameters Opcional. Caso o gerenciador da solicitação de um cron job retorne um código de status HTTP fora do intervalo entre 200 e 299, o App Engine considerará o job com falha. Por padrão, os jobs com falha não serão executados novamente. Tente executar novamente os jobs com falha incluindo blocos de parâmetros de novas tentativas no arquivo de configuração.

Consulte a seção Novas tentativas do cron para mais informações.

schedule Obrigatório. Define o programa de execução do cron job. Consulte a sintaxe abaixo.
target

A string target é anexada ao nome do host do seu aplicativo. Geralmente é o nome de um serviço. O cron job será encaminhado para a versão do serviço nomeado, configurado para o tráfego.

Se o nome do serviço especificado para target não for encontrado, a solicitação do cron será roteada para o serviço default ou para a versão do seu aplicativo que estiver configurada para receber tráfego. Para mais informações sobre o roteamento, consulte Como as solicitações são roteadas.

timezone timezone tem que ser o nome de um fuso horário zoneinfo padrão. Se você não especificar um fuso horário, os jobs serão executados em UTC (também conhecido como GMT).
url Obrigatório. O campo url é apenas um URL no aplicativo. Se o elemento url contiver os caracteres especiais XML &, <, >, ' ou ", faça o escape deles.

Como definir o cron job schedule

Os cron jobs são programados em intervalos recorrentes e especificados usando um formato simples semelhante ao inglês. É possível definir uma programação para que o job seja executado diversas vezes por dia ou em dias e meses determinados.

Intervalos subdiários

Use um intervalo subdiário para executar um job diversas vezes por dia em uma programação repetitiva. É possível definir um intervalo para o horário de término ou de início:

  • Intervalo de horário de término: define o período entre o horário de término de um job e o horário de início do próximo, em que o horário de término é o momento da conclusão ou expiração do job. O serviço Cron executa jobs nesse tipo de intervalo durante 24 horas começando à 00:00 e cumpre o período especificado entre cada job.

    Exemplo: para a programação every 5 minutes, o job é executado diariamente usando um intervalo de 5 minutos. Se a instância de um job em execução nessa programação for concluída às 2h01, o próximo job aguardará cinco minutos e recomeçará às 2h06.

  • Intervalo de horário de início: define um intervalo de tempo regular para o serviço Cron iniciar cada job. Ao contrário do intervalo de horário de término, o de horário de início executa cada job sem considerar quando o job anterior é concluído ou expira. É possível configurar um intervalo de tempo para a execução do job ou executar jobs 24 horas por dia, começando às 00:00.

    Como o horário de início de um job é rigoroso, quando a execução de uma instância dele é superior ao intervalo de tempo definido, o serviço Cron ignora o job. No intervalo, um horário de início individual será ignorado caso o job anterior não tenha sido concluído ou tenha expirado .

    Exemplo: para a programação every 5 minutes from 10:00 to 14:00, o primeiro job começa a ser executado em 10:00 e a cada cinco minutos depois disso. Se esse primeiro job for executado por sete minutos, o job de 10:05 será ignorado e, portanto, o serviço Cron não executará outra instância desse job até 10:10.

Intervalo personalizado

É possível usar um intervalo personalizado para definir uma programação em que o job seja executado uma vez por dia em um ou mais dias e em um ou mais meses selecionados. Os jobs que fazem parte de uma programação personalizada são executados durante todo o ano, apenas no horário específico, nos dias e meses selecionados.

Exemplo: para a programação 1,2,3 of month 07:00, o job é executado uma vez em 07:00 nos três primeiros dias de cada mês.

Considerações importantes sobre schedule:

  • É preciso decidir entre usar um intervalo subdiário ou personalizado. Não é possível misturar nem usar elementos dos diversos tipos de intervalos. Veja a seguir um exemplo de uma definição de programação inválida: <schedule>every 6 hours mon,wed,fri</schedule>.
  • Só é possível executar uma instância do job por vez. O serviço Cron foi projetado para fornecer a entrega "pelo menos uma vez". Ou seja, quando um job está programado, o App Engine envia a solicitação dele pelo menos uma vez. Em raras circunstâncias, é possível que sejam solicitadas diversas instâncias do mesmo job. Se isso acontecer, será necessário que o gerenciador de solicitações seja idempotente (em inglês) e que o código garanta que não haja efeitos colaterais prejudiciais.

Como formatar o schedule

Para especificar quando o job é executado, defina o elemento schedule usando a seguinte sintaxe:

<schedule>[TYPE] [INTERVAL_VALUE] [INTERVAL_SCOPE]</schedule>

Escolha um tipo de intervalo para definir seu elemento schedule:

Intervalo de horário de término
  • [TYPE]: intervalos diários precisam incluir o prefixo every.

    Exemplo: <schedule>every 12 hours</schedule>

  • [INTERVAL_VALUE]: um valor inteiro e a unidade de tempo correspondente. Valores válidos para a unidade de tempo:
    • minutes ou mins
    • hours
  • [INTERVAL_SCOPE]: não aplicável. Para definir um horário de início específico ou um intervalo de execução dos jobs, consulte a sintaxe do Intervalo de horário de início ou do Intervalo personalizado.
Exemplos de intervalo de horário de término
Os exemplos a seguir ajudarão a entender como definir programações de jobs que usam um intervalo de horário de término:
  • A execução começa todos os dias à meia-noite com intervalo de cinco minutos entre cada job. Após o término de cada job, o serviço Cron aguarda cinco minutos antes de executar o próximo:
    <schedule>every 5 minutes</schedule>
  • A execução começa todos os dias à meia-noite com intervalo de 30 minutos entre cada job. Após o término de cada um deles, o serviço Cron aguarda 30 minutos antes de executar o próximo:
    <schedule>every 30 mins</schedule>
Intervalo de horário de início
  • [TYPE]: intervalos diários precisam incluir o prefixo every.

    Exemplo: <schedule>every 12 hours</schedule>

  • [INTERVAL_VALUE]: um valor inteiro e a unidade de tempo correspondente. Valores válidos para a unidade de tempo:
    • minutes ou mins
    • hours
  • [INTERVAL_SCOPE] especifica uma cláusula que corresponde ao [INTERVAL_VALUE]. É possível definir um intervalo de tempo personalizado ou usar a opção 24 h synchronized.
    • Inclua a cláusula from [HH:MM] to [HH:MM] para definir um horário de início e um intervalo específicos para executar os jobs.

      É preciso especificar os valores de horário no formato 24 horas, HH:MM, em que:

      • HH são números inteiros de 00 a 23.
      • MM são números inteiros de 00 a 59.
    • Use synchronized para especificar um intervalo de tempo de 24 horas (from 00:00 to 23:59) que é igualmente dividido pelo valor de [INTERVAL_VALUE].

      Importante: o [INTERVAL_VALUE] precisa dividir 24 em um número inteiro, caso contrário ocorrerá um erro. Os valores válidos para o [INTERVAL_VALUE] incluem: 1, 2, 3, 4, 6, 8, 12 ou 24.

Exemplos de intervalos de horário de início
Os exemplos abaixo ajudarão a entender como definir programações de jobs que usam um intervalo de horário de início:
  • É executado a cada cinco minutos, das 10h às 14h, todos os dias:
    <schedule>every 5 minutes from 10:00 to 14:00</schedule>
  • É executado de hora em hora, das 08h às 16h, todos os dias:
    <schedule>every 1 hours from 08:00 to 16:00</schedule>
  • É executado a cada duas horas, a partir da meia-noite, todos os dias:
    <schedule>every 2 hours synchronized</schedule>
Intervalo personalizado
  • [TYPE]: os intervalos personalizados incluem o prefixo every para definir um intervalo repetitivo. Também é possível definir uma lista específica de dias em um mês:
    • Para definir um intervalo repetitivo, use o prefixo every.

      Exemplos:

      <schedule>every day 00:00</schedule>
      <schedule>every monday 09:00</schedule>

    • Para definir dias específicos, use números ordinais. Os valores válidos partem do 1º dia de um mês até o número máximo de dias desse mês, por exemplo:
      • 1st ou first
      • 2nd ou second
      • 3rd ou third
      • E até: 31st ou thirtyfirst

      Exemplo:

      <schedule>1st,3rd tuesday</schedule>
      <schedule>2nd,third wednesday of month 09:00</schedule>

  • [INTERVAL_VALUE]: intervalos personalizados incluem uma lista dos dias específicos em que você quer que o job seja executado. Ela precisa ser uma lista separada por vírgulas e pode incluir um dos valores a seguir:
    • O valor inteiro do dia no mês até 31 dias no máximo, por exemplo:
      • 1
      • 2
      • 3
      • E até: 31
    • O nome do dia em uma combinação de qualquer um dos valores abaixo, longos ou abreviados:
      • monday ou mon
      • tuesday ou tue
      • wednesday ou wed
      • thursday ou thu
      • friday ou fri
      • saturday ou sat
      • sunday ou sun
      • Use day para especificar todos os dias da semana.

    Exemplos:

    <schedule>2nd monday,thu</schedule>
    <schedule>1,8,15,22 of month 09:00</schedule>
    <schedule>1st mon,wednesday,thu of sep,oct,nov 17:00</schedule>

  • [INTERVAL_SCOPE]: especifica uma cláusula que corresponde ao [INTERVAL_VALUE] especificado. Os intervalos personalizados podem incluir a cláusula of [MONTH], que especifica um único mês em um ano ou uma lista separada por vírgulas de vários meses. Também é preciso definir um horário específico de execução do job, por exemplo: of [MONTH] [HH:MM].

    Por padrão, se a cláusula of for excluída, o intervalo personalizado será executado todos os meses.

    • [MONTH]: você precisa especificar os meses em uma lista separada por vírgulas podendo incluir uma mistura dos valores abaixo, longos ou abreviados:
      • january ou jan
      • february ou feb
      • march ou mar
      • april ou apr
      • may
      • june ou jun
      • july ou jul
      • august ou aug
      • september ou sep
      • october ou oct
      • november ou nov
      • december ou dec
      • Use month para especificar todos os meses do ano.
    • [HH:MM]: é preciso especificar os valores de horário no formato 24 horas, HH:MM, em que:
      • HH são números inteiros de 00 a 23.
      • MM são números inteiros de 00 a 59.
    • Exemplo:

      <schedule>1st monday of sep,oct,nov 09:00</schedule>
      <schedule>1 of jan,april,july,oct 00:00</schedule>

Exemplos de intervalos personalizados
Os exemplos a seguir ajudarão a entender como definir programações de jobs que usam um intervalo personalizado:
  • É executado todos os dias à meia-noite:
    <schedule>every day 00:00</schedule>
  • É executado todas as segundas-feiras às 9h:
    <schedule>every monday 09:00</schedule>
  • É executado uma vez na segunda quarta-feira de março às 17h:
    <schedule>2nd wednesday of march 17:00</schedule>
  • É executado seis vezes em maio. Durante as primeiras duas semanas, é executado uma vez em cada segunda, quarta e sexta-feira às 10h:
    <schedule>1st,second mon,wed,fri of may 10:00</schedule>
  • É executado uma vez por semana. A cada sete dias a partir do primeiro dia de cada mês, é executado uma vez às 9h:
    <schedule>1,8,15,22 of month 09:00</schedule>
  • É executado a cada duas semanas. Na primeira e terceira segundas-feiras de cada mês, é executado uma vez às 4h:
    <schedule>1st,third monday of month 04:00</schedule>
  • É executado três vezes por ano. Na primeira segunda-feira de setembro, outubro e novembro, é executado uma vez às 9h:
    <schedule>1st monday of sep,oct,nov 09:00</schedule>
  • É executado uma vez a cada trimestre. No primeiro dia de janeiro, abril, julho e outubro, ele é executado uma vez à meia-noite:
    <schedule>1 of jan,april,july,oct 00:00</schedule>

Novas tentativas do cron

Se o gerenciador da solicitação de um cron job retorna um código de status que não está no intervalo entre 200 e 299, o App Engine considera que o job falhou. Por padrão, os jobs com falha não são executados novamente. Para fazer novas tentativas de jobs com falha, inclua um bloco retry_parameters no seu arquivo de configuração.

Veja um arquivo de amostra cron.xml que contém um único cron job configurado para fazer até cinco novas tentativas (o padrão) com uma espera inicial de 2,5 segundos que dobra a cada vez.

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

Sintaxe das novas tentativas do cron

Veja descrições sobre os parâmetros das novas tentativas na tabela abaixo:

Elemento Descrição
job_retry_limit O número máximo de novas tentativas de um cron job com falha é de 5. Se especificado com job_age_limit, o App Engine fará uma nova tentativa do cron job até que ambos os limites sejam atingidos. Quando omitido nos parâmetros, o limite é 5, por padrão.
job_age_limit O limite de tempo para tentar novamente um cron job com falha. Ele é avaliado de acordo com o momento em que o cron job foi executado pela primeira vez. O valor é um número seguido por uma unidade de tempo, em que a unidade é s para segundos, m para minutos, h para horas ou d para dias. Por exemplo, o valor 5d especifica um limite de cinco dias após a primeira tentativa de execução do cron job. Se especificado com job_retry_limit, o App Engine fará uma nova tentativa do cron job até que ambos os limites sejam atingidos.
min_backoff_seconds O número mínimo de segundos a esperar antes de tentar novamente o cron job após a falha.
max_backoff_seconds O número máximo de segundos para esperar antes de tentar novamente o cron job após a falha.
max_doublings O número máximo de vezes que o intervalo entre as novas tentativas do cron job com falha será duplicado antes que o aumento se torne constante. A constante é: 2**(max_doublings - 1) * min_backoff.

Solicitações do Cron

Cabeçalhos das solicitações

As solicitações do Cron Service também contêm um cabeçalho HTTP:

X-Appengine-Cron: true

Esse e outros cabeçalhos são definidos internamente pelo App Engine. Se um cliente enviar esses cabeçalhos, eles serão removidos da solicitação. Como exceção, temos as solicitações de administradores conectados de apps legados, com autorização para configurar o cabeçalho para fins de testes.

Endereço IP de origem

O App Engine emite solicitações de cron usando o endereço IP 0.1.0.2. Para jobs do cron criados com versões anteriores do gcloud (anteriores a 326.0.0), as solicitações do Cron virão de 0.1.0.1.

Prazos

O prazo de tempo limite depende da classe da instância e do tipo de escalonamento configurados para o aplicativo:

Escalonamento automático
O tempo limite é de cerca de 10 minutos.
Escalonamento básico e manual
O tempo limite é de até 24 horas.

Para mais informações, consulte Como as instâncias são gerenciadas.

Limites

Os aplicativos gratuitos podem ter até 20 tarefas programadas. e os pagos podem ter até 250.

Suporte para o Cron no servidor de desenvolvimento

O servidor de desenvolvimento não executa os cron jobs automaticamente. Use o cron local ou interface de tarefas programadas para acionar os URLs dos jobs com a ferramenta curl ou similar.

Como implantar cron jobs

É possível usar a CLI gcloud para implantar os cron jobs no App Engine.

Para implantar os cron jobs especificados no arquivo de configuração cron.yaml, execute o seguinte comando:

gcloud

    gcloud app deploy cron.yaml

Maven

    mvn appengine:deployCron cron.yaml

Gradle

    gradle appengineDeployCron cron.yaml

Ambiente de desenvolvimento integrado

Se você usa IntelliJ ou Eclipse, use o formulário de implantação para selecionar os arquivos de configuração individuais a serem implantados.

Como excluir todos os cron jobs

Para excluir todos os cron jobs:

  1. Edite o conteúdo do arquivo cron.yaml para:

    cron:

  2. Implante o arquivo cron.yaml no App Engine.

Compatibilidade com o Cron no console

A página "Filas de tarefas" do Console do GCP tem uma guia que mostra as tarefas com cron jobs em execução.

Acesse também a página Registros para ver quando os cron jobs foram adicionados ou removidos.