DEV Community

Luis Fabrício De Llamas
Luis Fabrício De Llamas

Posted on

Quarkus Scheduler: tarefas agendadas do jeito certo em sistemas financeiros

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>
Enter fullscreen mode Exit fullscreen mode

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();
    }
}
Enter fullscreen mode Exit fullscreen mode

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 * * * ?
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)