Agendador de Tarefas Java: Quartz Scheduler
No desenvolvimento moderno em Java, surge frequentemente a necessidade de executar determinadas ações em um cronograma: envio de newsletters por e-mail, arquivamento de logs, sincronização de dados ou geração de relatórios. Para resolver essas tarefas, existe uma biblioteca poderosa e flexível chamada Quartz Scheduler. Este é um framework open-source que permite criar, agendar e gerenciar tarefas (Jobs) usando triggers e expressões cron. O Quartz integra-se facilmente com Spring Boot, Java EE e qualquer aplicação standalone.
Principais recursos do Quartz
- Agendamento flexível — suporte para intervalos simples (a cada N segundos/minutos) e expressões cron complexas.
- Persistência — armazenamento do estado das tarefas em um banco de dados (JDBC JobStore) para recuperação após reinicialização da aplicação.
- Clusterização — distribuição de tarefas entre vários nós para alta disponibilidade.
- Execução paralela — possibilidade de executar várias tarefas simultaneamente.
- Execuções perdidas — configuração de comportamento em caso de inatividade (misfire instructions).
Instalação e configuração
Para usar o Quartz, adicione a dependência no 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'Criando uma tarefa simples
Cada tarefa no Quartz é uma classe que implementa a interface Job. Dentro do método execute(), escreve-se a lógica de negócio.
import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;
public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Olá! Tarefa executada em " + new java.util.Date()); }}Configurando o agendador e o trigger
O agendador (Scheduler) é criado através da fábrica StdSchedulerFactory. Em seguida, cria-se um trigger — simples (SimpleTrigger) ou baseado em cron (CronTrigger).
import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;
public class QuartzExample { public static void main(String[] args) throws SchedulerException { // 1. Obtém o agendador Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. Define a tarefa JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("myJob", "group1") .build();
// 3. Cria o trigger — execução a cada 10 segundos Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build();
// 4. Vincula a tarefa ao trigger e inicia o agendador scheduler.scheduleJob(job, trigger); scheduler.start(); }}Usando expressões cron
Expressões cron permitem definir cronogramas complexos. Formato: segundos minutos horas dia-do-mês mês dia-da-semana.
// Execução todos os dias às 18:30CronScheduleBuilder cronSchedule = CronScheduleBuilder .dailyAtHourAndMinute(18, 30);
// Ou manualmente: "0 30 18 * * ?" (todos os dias às 18:30)Trigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedu