MBA in JAVA, SOA and Internet of Things at FIAP. MBA Systems Engineering at ESAB. 10 years experience in business analysis and web application.
Publicado em 01/08/2024
O agendamento de tarefas é uma funcionalidade crucial em muitas aplicações, especialmente quando se trata de automatizar tarefas repetitivas, executar grandes lotes de operações ou garantir que certas atividades sejam realizadas em intervalos específicos. O Spring Boot oferece maneiras práticas e eficazes para lidar com o agendamento de tarefas, facilitando a vida dos desenvolvedores. Neste post, vamos explorar como configurar e usar a anotação @Scheduled
no Spring Boot para agendar tarefas de maneira simples e eficiente.
O Spring Boot proporciona a anotação @Scheduled
para simplificar o agendamento de tarefas. Essa funcionalidade é baseada no ScheduledExecutorService
nativo do Java, com uma camada adicional de abstração oferecida pelo Spring Boot, permitindo que os desenvolvedores definam e gerenciem tarefas agendadas sem a necessidade de escrever muito código boilerplate.
Para habilitar o suporte ao agendamento de tarefas no Spring Boot, devemos adicionar a anotação @EnableScheduling
em uma classe de configuração. Veja como fazer isso:
@Configuration
@EnableScheduling
public class SchedulingConfig {
// Configurações adicionais, se necessário
}
Vamos explorar algumas maneiras de agendar tarefas usando a anotação @Scheduled
.
Podemos configurar uma tarefa para ser executada após um atraso fixo desde a última execução, garantindo que a próxima execução só comece depois que a anterior for concluída:
@Scheduled(fixedDelay = 5000) // Atraso de 5 segundos
public void executeTaskWithFixedDelay() {
System.out.println("Executando tarefa com atraso fixo - " + System.currentTimeMillis() / 1000);
}
As tarefas também podem ser configuradas para serem executadas em intervalos fixos de tempo, independentemente da duração da execução anterior:
@Scheduled(fixedRate = 5000) // Intervalo de 5 segundos
public void executeTaskAtFixedRate() {
System.out.println("Executando tarefa com taxa fixa - " + System.currentTimeMillis() / 1000);
}
Se for necessário que as tarefas sejam executadas em paralelo, podemos usar a anotação @Async
junto com @Scheduled
:
@EnableAsync
public class AsyncSchedulingConfig {
@Async
@Scheduled(fixedRate = 5000)
public void executeAsyncTask() throws InterruptedException {
System.out.println("Executando tarefa assíncrona - " + System.currentTimeMillis() / 1000);
Thread.sleep(7000); // Simula uma tarefa longa
}
}
Podemos também configurar uma tarefa para ser executada após um atraso inicial, além de um atraso fixo entre as execuções subsequentes:
@Scheduled(fixedDelay = 5000, initialDelay = 1000)
public void executeTaskWithInitialDelay() {
System.out.println("Executando tarefa com atraso inicial de 1 segundo - " + System.currentTimeMillis() / 1000);
}
Quando atrasos e taxas não são suficientes, podemos usar expressões cron para controlar de maneira mais flexível a agenda das tarefas:
@Scheduled(cron = "0 0 12 * * ?") // Todos os dias ao meio-dia
public void executeTaskUsingCronExpression() {
System.out.println("Executando tarefa agendada com expressão cron - " + System.currentTimeMillis() / 1000);
}
Para evitar hardcoding dos valores de agendamento, podemos usar expressões Spring para externalizar a configuração das tarefas:
@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")
public void executeTaskWithExternalizedConfig() {
System.out.println("Executando tarefa com configuração externa - " + System.currentTimeMillis() / 1000);
}
Por padrão, o Spring usa um agendador single-threaded local. Para executar tarefas em paralelo, podemos configurar um TaskScheduler
com um pool de threads:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("TaskScheduler-");
return scheduler;
}
Neste post, exploramos como configurar e usar a anotação @Scheduled
no Spring Boot para agendar tarefas de diferentes maneiras. Vimos como habilitar o suporte ao agendamento, criar tarefas com atraso fixo, taxa fixa, tarefas assíncronas, usar expressões cron e configurar tarefas com valores externos. O Spring Boot facilita o gerenciamento de tarefas agendadas, permitindo criar sistemas mais eficientes e automatizados.
Esperamos que este guia tenha sido útil para você começar a usar o agendamento de tarefas no Spring Boot. Se você tiver alguma dúvida ou sugestão, sinta-se à vontade para deixar um comentário abaixo!