使用EJB 3.1 Singleton Bean作为多个远程有状态会话Bean的客户端

时间:2011-10-02 22:19:04

标签: ejb state-machine stateful

我是EJB 3.1的新手,我正在尝试解决服务器端问题;也许有人可以提供一些指导。

我有一个状态机,代表我的应用程序中多个用户的共享状态。我正在尝试将此状态机建模为有状态会话Bean;由于这个状态机代表了多个用户,我引入了一个Singleton Session bean,它是StateMachine的实际客户端,所有用户最终成为Singleton bean的“Clients”。当我想在应用程序的整个生命周期中生命周期多个StateMachines时,我的问题就出现了。

我希望我的Singleton bean(“Manager”)处理客户端请求并分发到相应的StateMachine - 我将如何访问该Stateful bean的特定实例?为了进一步增加复杂性,我试图远程访问这些StateMachine bean(如果它是本地的,我只是创建这些东西的实例作为Manager的成员)。

无论如何,我希望这很清楚。我觉得我缺少EJB设计的一些基本点;你们都会告诉我是不是这样。

1 个答案:

答案 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