Enterprise Intermediário

Substitua timers pesados do EJB pelo ManagedScheduledExecutorService do Jakarta Concurrency para agendamentos mais simples.

✕ Java EE
@Stateless
public class ReportGenerator {
    @Resource
    TimerService timerService;

    @PostConstruct
    public void init() {
        timerService.createCalendarTimer(
            new ScheduleExpression()
                .hour("2").minute("0"));
    }

    @Timeout
    public void generateReport(Timer timer) {
        // runs every day at 02:00
        buildDailyReport();
    }
}
✓ Jakarta EE 10+
@ApplicationScoped
public class ReportGenerator {
    @Resource
    ManagedScheduledExecutorService scheduler;

    @PostConstruct
    public void init() {
        scheduler.scheduleAtFixedRate(
            this::generateReport,
            0, 24, TimeUnit.HOURS);
    }

    public void generateReport() {
        buildDailyReport();
    }
}
Viu um problema com este código? Nos avise.
🪶

Menos boilerplate

Sem callback @Timeout ou ScheduleExpression — use a API padrão do ScheduledExecutorService.

🧪

Melhor testabilidade

Métodos simples e mocks de executor tornam os testes unitários diretos, sem container EJB.

☁️

Pronto para a nuvem

Executores gerenciados integram-se ao ciclo de vida do container e funcionam em runtimes leves.

Abordagem Antiga
EJB TimerService
Abordagem Moderna
ManagedScheduledExecutorService
Desde o JDK
11
Dificuldade
Intermediário
EJB Timer vs Jakarta Scheduler
Disponível

Disponível desde o Jakarta EE 10 / Concurrency 3.0

Timers EJB exigem um bean @Stateless ou @Singleton com um callback @Timeout e expressões de agendamento via XML ou anotações. O Jakarta Concurrency oferece o ManagedScheduledExecutorService, que utiliza a conhecida API de agendamento do java.util.concurrent. O resultado é menos boilerplate, testes unitários mais fáceis e nenhuma dependência do container EJB.

Compartilhar 𝕏 🦋 in