EJB Timer vs Jakarta Scheduler
Reemplaza los temporizadores pesados de EJB por ManagedScheduledExecutorService de Jakarta Concurrency para una programación de tareas más sencilla.
@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 código repetitivo
Sin callback @Timeout ni ScheduleExpression — usa la API estándar de ScheduledExecutorService.
Mejor testabilidad
Métodos simples y mocks de executors hacen las pruebas unitarias directas sin contenedor EJB.
Apto para la nube
Los executors gestionados se integran con el ciclo de vida del contenedor y funcionan en runtimes ligeros.
Disponible desde Jakarta EE 10 / Concurrency 3.0
Los temporizadores EJB requieren un bean @Stateless o @Singleton con un callback @Timeout y expresiones de programación basadas en XML o anotaciones. Jakarta Concurrency proporciona ManagedScheduledExecutorService, que utiliza la conocida API de programación de java.util.concurrent. El resultado es menos código repetitivo, pruebas unitarias más fáciles y sin dependencia del contenedor EJB.