Enterprise Средний

Замените громоздкие EJB-таймеры на ManagedScheduledExecutorService из Jakarta Concurrency для более простого планирования задач.

✕ 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();
    }
}
Заметили проблему в этом коде? Сообщите нам.
🪶

Меньше шаблонного кода

Никаких @Timeout-колбэков или ScheduleExpression — используйте стандартный API ScheduledExecutorService.

🧪

Лучшая тестируемость

Простые методы и заглушки для Executor делают модульное тестирование без EJB-контейнера простым.

☁️

Совместимость с облачными подходами

Управляемые Executor-ы интегрируются в жизненный цикл контейнера и работают в облегчённых средах выполнения.

Старый подход
EJB TimerService
Современный подход
ManagedScheduledExecutorService
Начиная с JDK
11
Сложность
Средний
EJB Timer vs. Jakarta Scheduler
Доступно

Доступно начиная с Jakarta EE 10 / Concurrency 3.0

EJB-таймеры требуют @Stateless- или @Singleton-бина с @Timeout-колбэком и XML- или аннотационными выражениями расписания. Jakarta Concurrency предоставляет ManagedScheduledExecutorService, использующий привычный API планирования java.util.concurrent. Результат — меньше шаблонного кода, упрощённое модульное тестирование и отсутствие зависимости от EJB-контейнера.