EJB无状态初始化模式

时间:2014-03-11 17:46:00

标签: java-ee design-patterns architecture ejb-3.1

我有一个EJB无状态会话Bean。我有这些要求:

  1. 此无状态EJB应在启动时初始化
  2. 初始化代码应该对数据库进行事务性访问
  3. 问题是:

    1. @Startup仅适用于@Singleton EJB
    2. @PostConstruct注释(至少在Websphere上)此时没有事务上下文,所以初始化代码在这里爆炸!
    3. 可能的解决方案?

      1. 使用Java EE Timer但它似乎是为定期执行而设计的。我只想在零时刻执行一次。
      2. 仅出于初始化目的使用@Singleton + @Startup EJB,并将此单例EJB注入依赖的无状态EJB。
      3. 问题:

        1. 任何人都可以解释如何初始化无状态EJB吗?还是没有意义? (我的意思是,无状态EJB应该没有初始化状态?)
        2. 是否有任何模式表明使用辅助EJB @Singleton和@Startup是一个好主意?

3 个答案:

答案 0 :(得分:2)

初始化无状态EJB没有任何意义,因为这是Java EE容器的工作。 此外,Java EE 6本身提供IOC模式。 IOC基本上意味着隐藏注入资源的初始化过程。

您的2.解决方案是正确的,因为您需要事务访问。

然后你需要考虑两种情况/状态:

一个。单身人士开始正确

湾单身人士在启动时失败

换句话说,你确定你的(1.)语句是正确的还是你可以用lazy-init模式解释它?

当应用程序启动时出现@startup,也许在懒惰的init激活单例上的状态也符合你的需求?

答案 1 :(得分:1)

  

初始化代码应该对数据库进行事务性访问。

我不清楚数据库访问的内容,但是如果您需要获取一些数据并将其存储为无状态Bean的属性,请记住以下内容:

  • 此信息将在每个无状态实例中复制。

  • 每次创建新的bean实例时,您都将执行数据库查询。

  • 在某些时候,可能很难确定所有的bean实例都具有相同的状态。

我不知道模式的名称,但是将信息存储在Singleton会话bean中并将其注入无状态会话中,这是一个很好的解决方案。即使是Singleton bean也可以管理同时发生的请求,因此它不会成为瓶颈。它还允许您以更一致的方式管理可能的信息更改。

答案 2 :(得分:1)

最后我选择了:

  • EJB @Stateless - 引用 - > EJB @Singleton(带@Startup

这样,我就可以初始化为请求提供服务所需的(共享和只读)状态或上下文。