Último dia do mês com Spring Scheduling
Bora configurar um agendamento para o Último dia do mês com Spring Scheduling!
Problemática
Antes de tudo isso se tornou necessidade que me me deparei e imagino ser comum, então resolvi compartilhar o problema e a solução.
Sobretudo meu problema é o seguinte, precisava que meu sistema com executasse algumas rotinas no último dia de cada mês. Contudo, dando uma “googlada” para procurar sites que eu pudesse visualmente configurar o “períodos” de uma cron. Encontrei alguns mas gostei muito de um indicado por um amigo, inclusive vou deixar o link aqui tbm.
https://www.freeformatter.com/cron-expression-generator-quartz.html
Desse modo, vamos voltar ao meu problema! Do mesmo modo eu precisava que todo ultimo dia do mês, as 20 horas o sistema executasse alguns comandos de integração.
Dessa forma como essa aplicação já utiliza o Spring Scheduler fui estudar o parâmetros de cron do Scheduler do mesmo.
O Erro
Nesse sentido, seguindo os padrões do cron como o do site indicado, poderíamos ter a simples configuração: "0 0 20 L * *"
s
Sendo que o L seria referente ao último dia do mês, porém ao tentar utilizar no Scheduler do Spring recebemos o seguinte erro:
java.lang.IllegalStateException: Encountered invalid @Scheduled method ‘minhaRotinaMensal’: For input string: “L”
A Solução
Basicamente falando são 6 dígitos que precisam ser informados, que para o meu caso ficaria a seguinte tabela:
Segundos | Minutos | Horas | Dias | Meses | Ano |
0 | 0 | 20 | 28-31 | * | * |
"0 0 20 28-31 * *"
Com a configuração acima, nosso sistema irá executar a função da cron todo os dias, 28, 29, 30 e 31 de cada mês e o tratamento para saber se o ultimo dia mês. Para isso utilizei a biblioteca Calendar do java, como no exemplo a seguir.
@Scheduled(cron = "0 0 20 28-31 * *")
public void minhaRotinaMensal() {
Calendar hoje = Calendar.getInstance();
boolean ultimoDiaDoMes = hoje.get(Calendar.DATE) == hoje.getActualMaximum(Calendar.DATE);
if(ultimoDiaDoMes){
System.out.println("Executando rotinas Coffops!");
}
}
Com isso foi possível executar rotinas todo ultimo dia do mês. Talvez não seja a melhor opção, talvez seja, não sei.. Comente abaixo seu ponto de vista sobre a solução e/ou compartilhe um modo diferente para a solução do problema.
Logo, espero que você tenha conseguido configurar seu agendamento do Último dia do mês com Spring Scheduling ou qualquer outro que você precise!
Nesse meio tempo você pode gostar também: Alteração de Usuário Git