0

私は EJB 3.1 を初めて使用し、サーバー側の問題を解決しようとしています。おそらく誰かが何らかのガイダンスを提供できるでしょう。

アプリケーション内の複数のユーザーの共有状態を表すステート マシンがあります。このステート マシンをステートフル セッション Bean としてモデル化しようとしています。このステート マシンによって表されるユーザーは複数存在するため、StateMachine の実際のクライアントであるシングルトン セッション Bean を導入すると、すべてのユーザーがシングルトン Bean の「クライアント」になります。私の問題は、アプリケーションの存続期間中に複数の StateMachines をライフサイクルしたいときに発生します。

Singleton Bean (「マネージャー」) でクライアント要求を処理し、適切な StateMachine に配布したいのですが、その Stateful Bean の特定のインスタンスにアクセスするにはどうすればよいですか? さらに複雑にするために、これらの StateMachine Bean にリモートでアクセスしようとしています (ローカルの場合は、これらのオブジェクトのインスタンスを Manager のメンバーとして作成するだけです)。

とにかく、これが明確であることを願っています。EJB 設計の基本的な点が欠けているように感じます。もしそうなら、皆さんは私に教えてくれます。

4

1 に答える 1

1

シングルトンは EJB 3.1 で導入され、A Sampling of EJB 3.1 で説明されているように、複数のインスタンス間で状態を共有する機能を提供します。

シングルトン

EJB API で長年省略されていたのは、エンタープライズ Bean コンポーネントの複数のインスタンス間、またはアプリケーション内の複数のエンタープライズ Bean コンポーネント間で状態を簡単に共有する機能でした。対照的に、Java EE Web アプリケーション プログラミング モデルは、常に ServletConfig オブジェクトを通じてこのタイプの機能を提供してきました。EJB 3.1 では、シングルトンとも呼ばれるシングルトン Bean の導入により、この省略に対処しています。

シングルトンは、特定の Java 仮想マシン (JVM)* 内のアプリケーションに対して 1 回インスタンス化されることが保証されている新しい種類のセッション Bean です。次のコード例に示すように、シングルトンは @Singleton アノテーションを使用して定義されます。

@Singleton public class PropertiesBean {

private Properties props;
private int accessCount = 0;

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

public int getAccessCount() { ... }

これはセッション Bean のもう 1 つのフレーバーであるため、シングルトンは、ステートレス Bean およびステートフル Bean と同じローカルおよびリモート クライアント ビューを定義できます。クライアントは、ステートレス Bean およびステートフル Bean にアクセスするのと同じ方法で、つまり EJB 参照を介してシングルトンにアクセスします。たとえば、クライアントは次のように上記の PropertiesBean シングルトンにアクセスできます。

@EJB    private PropertiesBean propsBean;

...

String msg = propsBean.getProperty("hello.message"); ここで、コンテナーは、同じ JVM 内のすべての PropertiesBean 参照へのすべての呼び出しが、PropertiesBean の同じインスタンスによって処理されることを保証します。デフォルトでは、コンテナは他のコンポーネント タイプと同じスレッド保証を適用します。具体的には、特定の Bean インスタンスに一度にアクセスできる呼び出しは 1 つだけです。シングルトンの場合、これは同時呼び出しをブロックすることを意味します。ただし、これはデフォルトの同時実行動作です。シングルトン インスタンスへのより効率的な同時アクセスを可能にする追加の同時実行オプションがあります。

イベントを使用して通知を送信する方法については、Java EE6 イベントを参照してください。

于 2011-10-03T18:09:28.240 に答える