根据EJB规范,不允许使用非最终静态字段。对于定义为singleton的EJB 3.1无状态会话bean,情况仍然如此吗?
只是为了让事情更清楚,并防止出现问题,比如你想要这样做:
我遇到一种情况,我需要一个EJB来开始服务器启动,做一些与数据库相关的工作,只有当它完成时,它才会向系统中的所有其他组件发出信号,告诉他们可以开始工作。
此EJB也将使用计时器定义,因此它将每隔几分钟启动一次,因此,如果它第一次失败,它将再次尝试直到成功,或者直到有人注意到存在问题。一旦成功,标志将被更改,所有其他组件(计时器EJB)都可以启动。
所以我有一个Singleton EJB,我需要它来保存一个所有其他组件/ EJB都可以引用的静态(全局)标志。
答案 0 :(得分:1)
仍然禁止非最终静态字段,因为一旦您尝试群集应用程序,就会遇到问题。 EJB单例只是它们运行的服务器实例上的单例。如果您有两个服务器实例,则可以在静态字段中使用两个具有不同值的单例版本。
如果您需要全局标记,最好将其存储在数据库中。
答案 1 :(得分: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
类的多个实例,一个用于TestA
EJB,另一个用于TestB
EJB。鉴于此用例以及EJB编程模型试图保护程序员的倾向(无论好坏),保持对静态字段的限制似乎是合理的。
鉴于容器正在管理单例EJB的单个实例,您最好还是将全局状态存储为单例中的实例变量。将单例注入到其他bean中,它们都可以通过成员变量访问共享状态。无论如何,这就是单例EJB的重点。