Enterprise 中级

用 Jakarta Concurrency 的 ManagedScheduledExecutorService 替代重量级 EJB 定时器。

✕ 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。

🔧

标准 API

基于 java.util.concurrent 接口,熟悉且可测试。

🧪

更易测试

可以在单元测试中注入模拟调度器,EJB 定时器则不行。

旧方式
EJB TimerService
现代方式
ManagedScheduledExecutorService
自 JDK
11
难度
中级
EJB Timer 与 Jakarta 调度器
可用

自 Jakarta EE 10 / Concurrency 3.0 起可用

EJB 定时器需要带有 @Timeout 回调和 ScheduleExpression 配置的 @Stateless 或 @Singleton bean。ManagedScheduledExecutorService 使用标准 ScheduledExecutorService API,语法更简洁。

分享 𝕏 🦋 in