为什么要在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,尽管在这种情况下定时器配置是硬编码的。
我的服务是:
@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,尽管在这种情况下定时器配置是硬编码的。