我是EJB 3.1的新手,我正在尝试解决服务器端问题;也许有人可以提供一些指导。
我有一个状态机,代表我的应用程序中多个用户的共享状态。我正在尝试将此状态机建模为有状态会话Bean;由于这个状态机代表了多个用户,我引入了一个Singleton Session bean,它是StateMachine的实际客户端,所有用户最终成为Singleton bean的“Clients”。当我想在应用程序的整个生命周期中生命周期多个StateMachines时,我的问题就出现了。
我希望我的Singleton bean(“Manager”)处理客户端请求并分发到相应的StateMachine - 我将如何访问该Stateful bean的特定实例?为了进一步增加复杂性,我试图远程访问这些StateMachine bean(如果它是本地的,我只是创建这些东西的实例作为Manager的成员)。
无论如何,我希望这很清楚。我觉得我缺少EJB设计的一些基本点;你们都会告诉我是不是这样。
答案 0 :(得分:1)
EJB 3.1中引入了单例,提供了在A Sampling of EJB 3.1中描述的多个实例之间共享状态的能力。
单身
EJB API中长期存在的遗漏是能够轻松实现的 在企业bean组件的多个实例之间共享状态 或者在应用程序中的多个企业bean组件之间。通过 相比之下,Java EE Web应用程序编程模型始终如一 通过ServletConfig对象提供了这种类型的功能。在 EJB 3.1,这个省略已经引入了 单身豆,也称为单身人士。
单例是一种新的会话bean,可以保证 为特定Java Virtual中的应用程序实例化一次 机器(JVM)*。使用@Singleton定义单例 注释,如以下代码示例所示:
@Singleton public class PropertiesBean {
private Properties props; private int accessCount = 0; public String getProperty(String name) { ... } public int getAccessCount() { ... }
}因为它只是会话bean的另一种风格,单身就可以了 定义相同的本地和远程客户端视图作为无状态和 有状态的豆子。客户端以与他们相同的方式访问单身人士 访问无状态和有状态bean,即通过EJB 参考。例如,客户端可以访问上面的PropertiesBean 单身如下:
@EJB private PropertiesBean propsBean;
...
String msg = propsBean.getProperty(“hello.message”);在这里, 容器确保对所有PropertiesBean的所有调用 同一JVM中的引用由同一个实例提供服务 PropertiesBean。默认情况下,容器强制执行相同的线程 保证其他组件类型。具体来说,不超过一个 允许调用访问任何一个特定的bean实例 时间。对于单例,这意味着阻止任何并发调用。 但是,这只是默认的并发行为。有 额外的并发选项,允许更高效的并发 访问单例实例。
查看有关如何使用事件发送通知的Java EE6 Events。