Agendador de Tarefas Java: Quartz Scheduler
No desenvolvimento moderno em Java, surge frequentemente a necessidade de executar código em horários programados: envio de newsletters por email, limpeza de cache, geração de relatórios ou sincronização de dados. Para esses fins, existe a poderosa biblioteca Quartz Scheduler — o padrão de facto para agendamento de tarefas no ecossistema Java.
O Quartz Scheduler é um framework open-source que permite criar, agendar e gerenciar tarefas (Jobs) usando um sistema flexível de triggers. Ele suporta tanto atrasos simples quanto cronogramas cron complexos, é resiliente a falhas e pode ser integrado com Spring Boot, Jakarta EE e outras plataformas.
Principais Funcionalidades
- Agendamento Flexível — suporte para triggers simples (SimpleTrigger) com atraso e repetição, além de cron-triggers (CronTrigger) para cronogramas complexos.
- Persistência — tarefas e triggers podem ser armazenados em banco de dados (JDBC JobStore), garantindo a execução mesmo após a reinicialização da aplicação.
- Clusterização — possibilidade de executar várias instâncias do agendador com coordenação via banco de dados.
- Listeners — escuta de eventos de execução de tarefas (JobListener, TriggerListener) para logging ou processamento adicional.
- Monitoramento — API integrada para visualizar tarefas atuais, seu status e histórico de execução.
Instalação e Configuração
Para começar, adicione a dependência ao seu pom.xml (Maven):
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>Para Gradle:
implementation 'org.quartz-scheduler:quartz:2.3.2'Exemplo de Criação de uma Tarefa Simples
Criaremos uma classe que implementa a interface Job. Esta é a nossa tarefa:
import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.time.LocalTime;
public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Tarefa executada às: " + LocalTime.now()); // Aqui seu código de negócio }}Agendamento de Tarefa com SimpleTrigger
Executaremos a tarefa após 5 segundos e repetiremos a cada 10 segundos:
import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;
public class SimpleSchedulerExample { public static void main(String[] args) throws SchedulerException { // 1. Criamos o agendador Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. Definimos a tarefa (JobDetail) JobDetail job = JobBuilder.newJob(SimpleJob.class) .withIdentity("myJob", "group1") .build();
// 3. Criamos o trigger: início após 5 segundos, repetição a cada 10 segundos Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.SECOND)) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build();
// 4. Atribuímos a tarefa ao trigger e iniciamos scheduler.scheduleJob(job, trigger); scheduler.start(); }}Uso de CronTrigger para Cronogramas Complexos
Expressões cron permitem definir cronogramas de qualquer complexidade. Por exemplo, todos os dias às 9:30 da manhã:
Trigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1")