在WebSphere 8.0上运行的Java EE 6应用程序的上下文中,我需要在执行任何业务方法之前执行许多启动任务。为此目的使用@Startup @Singleton bean似乎是一个很有前景的解决方案。但是,我并不完全清楚应用程序生命周期的确切外观。 EJB 3.1 spec声明如下:
默认情况下,容器负责决定何时执行 初始化Singleton bean实例。但是,bean开发者可以 可选择配置Singleton以进行急切初始化。如果 启动注释出现在Singleton bean类或者是 Singleton已通过部署描述符指定为 要求急切初始化,容器必须初始化 应用程序启动序列期间的Singleton bean实例。 容器必须在之前初始化所有这样的启动时单例 任何客户端请求都会传递给任何企业bean组件 申请。
在最后一句中,究竟是什么构成了“初始化”?在将企业bean用于客户端请求之前,容器是否会等待@Startup bean的@PostConstruct方法返回?
说到“客户端请求”,在这种情况下,使用@Scheduled注释计数的EJB方法的预定执行是否为一个?
我需要保证在应用程序启动之前执行某些代码,然后才能运行任何应用程序的各种EJB中的任何业务方法,无论是通过客户端调用还是计划执行。在@Singleton @Startup bean的@PostConstruct方法中运行启动代码是否提供了这样的保证?如果没有,还有其他方法可以保证这种行为吗?
答案 0 :(得分:7)
@PostConstruct
bean的@Startup
方法(“EJB应用程序”)返回。@PostConstruct
方法完成,因此@PostConstruct
方法不能等待计时器回调调用完成。