Enterprise Fortgeschritten

Ersetze schwerfällige EJB-Timer durch den ManagedScheduledExecutorService von Jakarta Concurrency für einfachere Aufgabenplanung.

✕ 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();
    }
}
Problem mit diesem Code entdeckt? Sag uns Bescheid.
🪶

Weniger Boilerplate

Kein @Timeout-Callback oder ScheduleExpression — verwende die Standard-API von ScheduledExecutorService.

🧪

Bessere Testbarkeit

Einfache Methoden und Executor-Mocks machen Unit-Tests ohne EJB-Container unkompliziert.

☁️

Cloud-native-freundlich

Verwaltete Executors integrieren sich in den Container-Lebenszyklus und funktionieren in leichtgewichtigen Laufzeiten.

Alter Ansatz
EJB TimerService
Moderner Ansatz
ManagedScheduledExecutorService
Seit JDK
11
Schwierigkeitsgrad
Fortgeschritten
EJB Timer vs. Jakarta Scheduler
Verfügbar

Verfügbar seit Jakarta EE 10 / Concurrency 3.0

EJB-Timer benötigen einen @Stateless- oder @Singleton-Bean mit einem @Timeout-Callback und XML- oder annotationsbasierten Zeitplanausdrücken. Jakarta Concurrency stellt ManagedScheduledExecutorService bereit, der die vertraute java.util.concurrent-Planungs-API verwendet. Das Ergebnis ist weniger Boilerplate, einfachere Unit-Tests und keine EJB-Container-Abhängigkeit.

Teilen 𝕏 🦋 in