Java 我可以在EJB3.1单例中定义一个非最终静态字段吗

Java 我可以在EJB3.1单例中定义一个非最终静态字段吗,java,ejb,ejb-3.1,Java,Ejb,Ejb 3.1,根据EJB规范,不允许使用非最终静态字段。对于定义为singleton的EJB3.1无状态会话bean,情况仍然如此吗 只是为了让事情变得更清楚,并避免像你为什么要这么做这样的问题: 我有一种情况,我需要一个EJB来启动服务器,做一些与数据库相关的工作,只有当它完成时,它才会向系统中的所有其他组件发出信号,表明它们可以开始工作 此EJB还将使用计时器定义,因此它将每隔几分钟启动一次,因此,如果第一次失败,它将重试,直到成功,或者直到有人注意到出现问题。一旦成功,标志将被更改,所有其他组件(计时器

根据EJB规范,不允许使用非最终静态字段。对于定义为singleton的EJB3.1无状态会话bean,情况仍然如此吗

只是为了让事情变得更清楚,并避免像你为什么要这么做这样的问题:

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

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


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

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


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

请注意,类是具有单例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>

种皮
org.example.SingletonBean
测试B
org.example.SingletonBean
在本例中,将有多个
SingletonBean
类实例,一个用于
TestA
EJB,另一个用于
TestB
EJB。考虑到这个用例和EJB编程模型试图保护程序员的倾向(无论是好是坏),保持对静态字段的限制似乎是合理的


考虑到容器正在管理单例EJB的单个实例,您也可以将全局状态作为实例变量存储在单例EJB中。将单例注入到其他bean中,它们都可以通过成员变量访问共享状态。这就是单例EJB的要点。

向单例添加静态变量没有意义-系统中只存在一个静态变量,为什么需要共享状态?此外,无状态会话bean的全部要点是不具有状态,因此它们可以更容易地被池化和重用。。那么,为什么要将无状态会话bean设置为单例呢?为什么要添加(全局的,更糟的)状态呢?我的应用程序没有集群化,也不打算很快集群化,所以在这种情况下应该不会有问题,对吗?我想把它保存到DB,但是每次组件询问它是否可以启动时,我需要检查DB,这是很多额外的流量。只要定义静态的类不会被垃圾收集(不太可能),它就可以工作,但是还有其他事情要考虑。初始化是否是一次性的,即是否希望标志在服务器重新启动后仍然有效?如果是这样,DB仍然会更好。没有理由不缓存标志以防止太多的数据库命中。安装基本上是一次性的,但即使服务器重新启动,EJB也会识别表中没有行(因为它们在第一次运行时被删除),并将标志设置为true。@NickWilson Singleton状态已经是每个JVM的,所以我不认为“集群中不同的静态值”是一个令人信服的答案。