Expressão cron da primavera para todos os dias 1: 01: am

202

Estou tentando executar meu código em um agendamento fixo, com base em uma expressão do cron do Spring. Gostaria que o código fosse executado todos os dias às 1: 01: 00. Tentei a seguinte expressão, mas isso não foi acionado para mim. O que há de errado com a sintaxe aqui?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}
d-man
fonte
minha expressão cron 0 0 0 1 JAN MON estava funcionando até o ano passado. A partir de 1º de janeiro, pare de trabalhar dizendo expressão cron inválida. Embora isso fosse destinado a uma frequência muito menor, mas conseguimos executar o servidor tc. depois de 01 de janeiro não. Quando mudei para 0 0 7? * SUN começou a funcionar. Estou curioso para saber por que 0 0 0 1 JAN MON parou de trabalhar onde estava bem no ano passado jan.
Spandey
0 0 0 01 de janeiro MON pode ser expressão errada, bem neste também que estava trabalhando e servidor tc nunca reclamam
spandey

Respostas:

573

Tente com:

@Scheduled(cron = "0 1 1 * * ?")

Abaixo, você pode encontrar os exemplos de padrões no fórum da primavera:

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0 8,10 * * *" = 8 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

A expressão cron é representada por seis campos:

second, minute, hour, day of month, month, day(s) of week

(*) significa combinar com qualquer

*/X significa "todo X"

?("nenhum valor específico") - útil quando você precisa especificar algo em um dos dois campos em que o caractere é permitido, mas não no outro. Por exemplo, se eu quiser que meu gatilho seja acionado em um determinado dia do mês (por exemplo, o dia 10), mas não me importo com o dia da semana, eu colocaria "10" no dia- campo do mês e "?" no campo do dia da semana.

PS: Para que funcione, lembre-se de habilitá-lo no contexto do aplicativo: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling- suporte de anotação

gipinani
fonte
15
O formato também está documentado na própria primavera aqui - docs.spring.io/spring/docs/3.0.x/api/org/springframework/…
chrismarx
1
Eu acho que o Spring Cron é capaz de fornecer provisão de segundos também, mas o cron unix normal é baseado em minutos ... como nas páginas de manual do unix, o minuto é a menor unidade de tempo que pode ser configurada.
Nanosoft
8
qual é o significado do "?" personagem? Aplica-se apenas ao campo "dia (s) da semana"? Funcionaria / faria algo diferente se substituíssemos o '?' com '*' no exemplo do dia de Natal?
encrest
1
@encrest, dê uma olhada aqui: stackoverflow.com/questions/11499740/…
gipinani
90

Para o meu agendador, estou usando-o para disparar às 6 da manhã todos os dias e minha notação cron é:

0 0 6 * * *

Se você quiser 1: 01: am, defina-o como

0 1 1 * * *

Código completo para o planejador

@Scheduled(cron="0 1 1 * * *")
public void doScheduledWork() {
    //complete scheduled work
}

** MUITO IMPORTANTE

Para ter certeza da exatidão do tempo de disparo do seu agendador, você deve definir o valor da zona como este (estou em Istambul):

@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
    //complete scheduled work
}

Você pode encontrar os valores completos do fuso horário aqui .

Nota: A versão da minha estrutura Spring é: 4.0.7.RELEASE

Bahadir Tasdemir
fonte
1
Não sei por que sua resposta tem apenas 12, mesmo que seja a única resposta correta aqui!
2
Muito obrigado @MoayadAbuJaber. A pontuação não é importante, se os desenvolvedores conseguem resolver seus problemas com minhas respostas, basta.
Bahadir Tasdemir
posso usar zona com sheduler configuração xml <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>?
shareef
3
polegares para cima para mencionar fuso horário
Forhad
2
Obrigado, @Forhad. Se você é um desenvolvedor e está lidando com algum dos problemas relacionados às datas e horas, precisa conhecer os detalhes dos carimbos de data e hora, fusos horários e conversões. Caso contrário, seus dados estarão absurdo
Bahadir Tasdemir
22

Você pode usar para anotar seu método @Scheduled(cron ="0 1 1 * * ?").

0 - é por segundos

1- 1 minuto

1 hora do dia.

user3298173
fonte
12

Falta algo na resposta de gipinani

@Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")

Isso será executado em 1.01 e 13.01. Pode ser usado quando você precisar executar o trabalho sem um padrão várias vezes ao dia.

E o atributo da zona é muito útil quando você faz implantações em servidores remotos. Isso foi introduzido na primavera 4.

Maleen Abewardana
fonte
2
Note-se que o suporte de abreviaturas (por fuso horário) é apenas compatibilidade 1.1.x JDK e nomes completos deve ser utilizado - como por javadoc
slashron
6

Uma coisa que notei é: o Spring CronTrigger não é cron. Você pode terminar com 7 parâmetros em uma expressão cron válida (que você pode validar no cronmaker.com) e, em seguida, não aceitar. Na maioria dos casos, você apenas exclui o último parâmetro e tudo funciona bem.

Irlan Cidade
fonte
1
"CronTrigger não é quartzo"
Sandy Simonton