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
難易度
中級
JDKサポート
EJBタイマーとJakartaスケジューラーの比較
利用可能
Jakarta EE 10 / Concurrency 3.0以降、利用可能
仕組み
EJBタイマーは@Statelessまたは@Singletonビーンと@Timeoutコールバック、XMLまたはアノテーションベースのスケジュール式が必要です。Jakarta ConcurrencyはManagedScheduledExecutorServiceを提供し、使い慣れたjava.util.concurrent スケジューリングAPIを使用します。ボイラープレートが少なく、ユニットテストが容易で、EJBコンテナへの依存もありません。
関連ドキュメント