0

根据 EJB 规范,不允许使用非最终静态字段。定义为单例的 EJB 3.1 无状态会话 bean 是否仍然如此?

只是为了让事情更清楚,并防止诸如您为什么要这样做的问题:

我有一种情况,我需要一个 EJB 来开始服务器启动工作,做一些与数据库相关的工作,只有当它完成时,它才会向系统中的所有其他组件发出信号,表明它们可以开始工作。

此 EJB 也将使用计时器定义,因此它将每隔几分钟启动一次,因此,如果它第一次失败,它将重试直到成功,或者直到有人注意到有问题。一旦成功,标志将被更改,并且所有其他组件(计时器 EJB)都可以启动。

所以我有一个单例 EJB,我需要它来保存所有其他组件/EJB 可以引用的静态(全局)标志。

4

2 回答 2

1

仍然禁止非最终静态字段,因为一旦您尝试对应用程序进行集群,就会遇到问题。EJB 单例只是运行它们的服务器实例上的单例。如果你有两个服务器实例,你可以有两个版本的单例,在你的静态字段中具有不同的值。

如果您需要全局标志,最好将其存储在数据库中。

于 2012-05-21T10:58:33.457 回答
0

请注意,类与单例 EJB 定义是一对多的。换句话说:

<session>
  <ejb-name>TestA</ejb-name>
  <ejb-class>org.example.SingletonBean</ejb-class>
</session>
<session>
  <ejb-name>TestB</ejb-name>
  <ejb-class>org.example.SingletonBean</ejb-class>
</session>

在此示例中,将有多个SingletonBean类实例,一个用于TestAEJB,另一个用于TestBEJB。考虑到这个用例和 EJB 编程模型试图保护程序员的倾向(无论好坏),保持对静态字段的限制似乎是合理的。

鉴于容器正在管理单例 EJB 的单个实例,您不妨将全局状态作为实例变量存储在单例中。将单例注入到您的其他 bean 中,它们都可以通过成员变量访问共享状态。无论如何,这就是单例 EJB 的意义所在。

于 2012-05-21T21:36:46.280 回答