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

时间:2016-09-22 16:11:46

标签: java-ee websphere ejb-3.1

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

  

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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