0

我对 EJB 3.1 非常陌生,正在尝试解决服务器端问题;也许有人可以提供一些指导。

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

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

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

4

1 回答 1

1

EJB 3.1 中引入了单例,提供了在多个实例之间共享状态的能力,如EJB 3.1 的采样中所述。

单身人士

EJB API 中长期存在的一个遗漏是在企业 bean 组件的多个实例之间或应用程序中的多个企业 bean 组件之间轻松共享状态的能力。相比之下,Java EE Web 应用程序编程模型始终通过 ServletConfig 对象提供这种类型的功能。在 EJB 3.1 中,通过引入单例 bean(也称为单例)解决了这一遗漏问题。

单例是一种新的会话 bean,保证为特定 Java 虚拟机 (JVM)* 中的应用程序实例化一次。使用@Singleton 注解定义单例,如以下代码示例所示:

@Singleton 公共类 PropertiesBean {

private Properties props;
private int accessCount = 0;

public String getProperty(String name) { ... }

public int getAccessCount() { ... }

因为它只是另一种形式的会话 bean,所以单例可以定义与无状态和有状态 bean 相同的本地和远程客户端视图。客户端访问单例的方式与访问无状态和有状态 bean 的方式相同,即通过 EJB 引用。例如,客户端可以按如下方式访问上述 PropertiesBean 单例:

@EJB    private PropertiesBean propsBean;

...

String msg = propsBean.getProperty("hello.message"); 在这里,容器确保对同一 JVM 中所有 PropertiesBean 引用的所有调用都由同一 PropertiesBean 实例提供服务。默认情况下,容器强制执行与其他组件类型相同的线程保证。具体来说,在任何时候都只允许一次调用访问特定的 bean 实例。对于单例,这意味着阻止任何并发调用。但是,这只是默认的并发行为。还有其他并发选项允许更有效地并发访问单例实例。

查看Java EE6 Events,了解如何使用事件发送通知。

于 2011-10-03T18:09:28.240 回答