用 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
难度
中级
JDK 支持
EJB Timer 与 Jakarta 调度器
可用
自 Jakarta EE 10 / Concurrency 3.0 起可用
工作原理
EJB 定时器需要带有 @Timeout 回调和 ScheduleExpression 配置的 @Stateless 或 @Singleton bean。ManagedScheduledExecutorService 使用标准 ScheduledExecutorService API,语法更简洁。
相关文档