EJB Timer vs. Jakarta Scheduler
Замените громоздкие EJB-таймеры на ManagedScheduledExecutorService из Jakarta Concurrency для более простого планирования задач.
@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();
}
}
Меньше шаблонного кода
Никаких @Timeout-колбэков или ScheduleExpression — используйте стандартный API ScheduledExecutorService.
Лучшая тестируемость
Простые методы и заглушки для Executor делают модульное тестирование без EJB-контейнера простым.
Совместимость с облачными подходами
Управляемые Executor-ы интегрируются в жизненный цикл контейнера и работают в облегчённых средах выполнения.
Доступно начиная с Jakarta EE 10 / Concurrency 3.0
EJB-таймеры требуют @Stateless- или @Singleton-бина с @Timeout-колбэком и XML- или аннотационными выражениями расписания. Jakarta Concurrency предоставляет ManagedScheduledExecutorService, использующий привычный API планирования java.util.concurrent. Результат — меньше шаблонного кода, упрощённое модульное тестирование и отсутствие зависимости от EJB-контейнера.