Se você já precisou rodar algo automaticamente em segundo plano — verificar vencimentos, enviar notificações, processar pagamentos — sabe que a solução errada vira pesadelo de manutenção.
O Quarkus Scheduler resolve isso de forma elegante. Sem XML, sem complexidade, sem dor de cabeça.
O problema real
Imagine um sistema de cobranças. Todos os dias precisamos:
- Verificar quais cobranças venceram
- Gerar um relatório matinal com o total em aberto
- Disparar o processamento das pendências
Fazer isso manualmente é inviável. Precisamos de jobs automáticos, confiáveis e fáceis de configurar.
Quarkus Scheduler ao resgate
Primeiro, a dependência no pom.xml:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-scheduler</artifactId>
</dependency>
Depois, é só anotar o método:
@ApplicationScoped
public class CobrancaScheduler {
@Inject
CobrancaService cobrancaService;
@Scheduled(every = "30s", identity = "verificar-vencidas")
void verificarCobrancasVencidas() {
int total = cobrancaService.marcarVencidasComoVencidas();
if (total > 0) {
LOG.infof("%d cobranças marcadas como vencidas.", total);
}
}
@Scheduled(cron = "0 0 8 * * ?", identity = "relatorio-diario")
void gerarRelatorioDiario(ScheduledExecution execution) {
BigDecimal totalVencido = cobrancaService.totalVencido();
LOG.infof("[Relatório] %s | Vencido: R$ %s", execution.getScheduledFireTime(), totalVencido);
}
@Scheduled(cron = "{cobranca.processamento.cron}", identity = "processar-pendentes")
void processarCobrancasPendentes() {
cobrancaService.processarPendentes();
}
}
Três anotações, três jobs. Simples assim.
Os tipos de agendamento
every — intervalo fixo. "30s" roda a cada 30 segundos. Pode usar "5m", "1h", etc.
cron — expressão Quartz. Se você veio do Spring, a sintaxe é a mesma. O campo ? no lugar do dia da semana é obrigatório no formato Quartz.
cron via config — a sacada está aqui. Ao usar "{cobranca.processamento.cron}", você delega o valor para o application.properties:
cobranca.processamento.cron=0 */5 * * * ?
Isso significa que você pode mudar o agendamento sem recompilar. Em produção, isso é ouro.
O parâmetro ScheduledExecution
Você pode receber um ScheduledExecution nos métodos anotados com @Scheduled. Com ele, você tem acesso a:
-
getScheduledFireTime()— quando foi agendado para rodar -
getFireTime()— quando de fato rodou -
getTrigger()— detalhes do gatilho
Útil para logs e auditoria.
Rodando o projeto
git clone https://github.com/dellamas/quarkus-scheduler-fintech
cd quarkus-scheduler-fintech
./mvnw quarkus:dev
Enquanto sobe, você já vê os logs dos schedulers disparando. Acesse http://localhost:8080/cobrancas para ver as cobranças em memória.
Quando usar e quando não usar
Use o Quarkus Scheduler quando:
- Você tem uma instância única da aplicação
- Os jobs são simples e não precisam persistir estado entre execuções
- Você quer zero configuração extra
Se precisar de clustering (múltiplas instâncias rodando o mesmo job sem conflito), dá uma olhada no Quarkus Quartz — que usa banco de dados para coordenar.
O código completo tá no GitHub.
Se curtiu, deixa a ⭐ e me segue lá!
Até o próximo. 🚀
Top comments (0)