为什么要在EJB中使用@Startup做定时器服务?

Why should we use @Startup for timer service in EJB?

我的服务是:

@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class JobTest {

    @Resource
    private TimerService timerService;

    @PostConstruct
    public void init() {
        timerService.createTimer(0,1000, "Every second timer with no delay");
    }

    @Timeout
    public void execute() {
        System.out.println("execute your job here");
    }

}

但是,作业没有执行。但是当将@Startup 添加到服务时,代码 运行 符合预期。你能解释一下为什么我们需要 @Startup 来使用 timerService 资源吗?

EJB 容器不会创建托管 Bean 的实例,除非使用 @Startup 查找、注入或注释这些实例。用 @PostConstruct 注释的方法从不为问题中的 EJB 调用,因此从不创建计时器,因此没有回调发生。

如果您使用以编程方式创建的计时器(由于来自配置的延迟值),您需要强制急切初始化 - 通过使用 @Startup 或将其注入另一个 @Startup bean。

另一种选择是通过使用 @Schedule 注释对方法进行注释来使用 automatically created timers,尽管在这种情况下定时器配置是硬编码的。