EJB Timer vs Jakarta Scheduler
Substitua timers pesados do EJB pelo ManagedScheduledExecutorService do Jakarta Concurrency para agendamentos mais simples.
@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();
}
}
@ApplicationScoped
public class ReportGenerator {
@Resource
ManagedScheduledExecutorService scheduler;
@PostConstruct
public void init() {
scheduler.scheduleAtFixedRate(
this::generateReport,
0, 24, TimeUnit.HOURS);
}
public void generateReport() {
buildDailyReport();
}
}
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.
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.