Enterprise 中級

EJBタイマーとJakartaスケジューラーの比較

重量級EJBタイマーをJakarta ConcurrencyのManagedScheduledExecutorServiceによるシンプルなスケジューリングに置き換える。

✕ 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は不要で、標準のScheduledExecutorService APIを使います。

🧪

テスト容易性の向上

プレーンなメソッドとexecutorモックにより、EJBコンテナなしで直感的にユニットテストできます。

☁️

クラウドネイティブ対応

マネージドエグゼキューターはコンテナのライフサイクルと統合し、軽量ランタイムでも動作します。

旧来のアプローチ
EJB TimerService
モダンなアプローチ
ManagedScheduledExecutorService
JDKバージョン
11
難易度
中級
EJBタイマーとJakartaスケジューラーの比較
利用可能

Jakarta EE 10 / Concurrency 3.0以降、利用可能

EJBタイマーは@Statelessまたは@Singletonビーンと@Timeoutコールバック、XMLまたはアノテーションベースのスケジュール式が必要です。Jakarta ConcurrencyはManagedScheduledExecutorServiceを提供し、使い慣れたjava.util.concurrent スケジューリングAPIを使用します。ボイラープレートが少なく、ユニットテストが容易で、EJBコンテナへの依存もありません。

共有 𝕏 🦋 in