@Singleton @Startup @PostConstruct方法保证在EJB可用于客户端调用之前返回?

Lor*_*ulu 9 websphere java-ee ejb-3.1

在WebSphere 8.0上运行的Java EE 6应用程序的上下文中,我需要在执行任何业务方法之前执行许多启动任务.为此目的使用@Startup @Singleton bean似乎是一个很有前景的解决方案.但是,我并不完全清楚应用程序生命周期的确切外观.在EJB 3.1规范规定如下:

默认情况下,容器负责决定何时初始化Singleton bean实例.但是,bean开发人员可以选择配置Singleton以进行急切初始化.如果Startup注释出现在Singleton bean类上,或者如果Singleton已经通过部署描述符指定为需要初始化初始化,则容器必须在应用程序启动序列期间初始化Singleton bean实例.在将任何客户端请求传递到应用程序中的任何企业bean组件之前,容器必须初始化所有此类启动时单例.

  1. 在最后一句中,究竟是什么构成了"初始化"?在使企业bean可用于客户端请求之前,容器是否会等待@Startup bean的@PostConstruct方法返回?

  2. 说到"客户端请求",在这种情况下,使用@Scheduled注释计数的EJB方法的预定执行是否为一个?

我需要保证在应用程序启动之前执行某些代码,然后才能运行任何应用程序的各种EJB中的任何业务方法,无论是通过客户端调用还是计划执行.在@Singleton @Startup bean的@PostConstruct方法中运行启动代码是否提供了这样的保证?如果没有,有没有其他方法来保证这种行为?

Bre*_*ail 7

  1. 是的,容器在允许任何客户端请求之前等待模块@PostConstruct中所有@Startupbean 的方法("EJB应用程序")返回.
  2. 是的,这是WebSphere Application Server中的情况,正如知识中心中的开发单例会话bean主题所暗示的那样," 单个bean中的PostConstruct方法可以创建EJB计时器[...]但是,为了避免死锁,PostConstruct方法不能等待EJB计时器运行".换句话说,计时器回调调用将等待@PostConstruct方法完成,因此@PostConstruct方法不能等待计时器回调调用完成.