3

EJB3 セッション Bean のリクエスト スコープのコンテキストはありますか? 私の環境は Java-EE-5 です。

この例

@Remote(SessionFacade.class) @Stateless
public class SessionFacadeBean implements SessionFacade {
  @EJB
  private Other bean;

  public void myBusinessMethod() {
     // TODO: get or create *myRequestScope*
     *myRequestScope*.put("demo", Integer.valueOf( 1 ));
     bean.otherBusinessMethod();
     sysout(*myRequestScope*.get("demo"));
  }
}

@Local(Other.class) @Stateless
public class OtherBean implements Other {
  public void otherBusinessMethod() {
     // TODO: get or create *myRequestScope*
     *myRequestScope*.put("demo", Integer.valueOf( 2 ));
  }
}

並列呼び出しに関係なく、SessionFacadeBean#myBusinessMethod() を呼び出すときは常に「2」を出力する必要があります。

CDI を使用する余裕はありません。また、トランザクションの伝播とは独立して動作する必要があります (したがって、JCA もオプションではありません)。

4

2 に答える 2

1

ステートレス EJB は、その名前が示すように状態を保存しないため、リクエスト スコープの概念はありません。現在のランタイム セッション コンテキストに限定されたセッション スコープがあり、状態も保存できないため、Bean 内またはコンテナー内に状態を保存するオプションが除外されます。

変数を使用することで運が良くなる場合もありThreadLocalますが、これは名前が示すように、現在の実行スレッドにスコープが設定されています。投稿されたコードを見ると、これはあなたが望むもののようです。このアプローチの問題点は、

  • ThreadEJB メソッドの実行が完了すると、オブジェクトは破棄されません。それらはコンテナーのスレッド プールに返されます。したがって、別の実行コンテキストで ThreadLocal 値を読み取ると、同じスレッドを使用した以前の実行コンテキストの値が見つかります。つまり、アプリケーションが値を読み取る前に、常に ThreadLocal オブジェクトに値を入れるようにしてください。
  • さらに、不要になったら ThreadLocal オブジェクトをすべて解放してください。解放しないと、メモリ リークが発生する可能性があります。
于 2011-06-05T10:08:55.477 に答える
0

ステートレス セッション Bean のリクエスト スコープのコンテキストはありますか?

簡単な答えはノーです。

長い答えは次のとおりです。ビジネス メソッドの呼び出し間でデータを共有するには、何らかのコンテキストが必要です。これは設計上の問題である可能性があります。Requestscope は Web 層の概念です。

  • Web 層では、リクエスト、ページ、セッション、およびアプリケーション スコープが Hashmap として実装されます。したがって、ハッシュマップへの参照をコンテキストとして渡して、すべてのデータを共有できます。

  • もう 1 つのアプローチは、シングルトンを使用することです (ノード間で共有する必要があります。たとえば、ehcache を使用します)。

  • EJB 3.1 に移行して @Singleton を使用する

  • ステートフル Bean の使用を検討し、リクエスト スコープを離れた後に削除できる Bean セッション スコープにリクエスト スコープを配置します。

于 2011-06-05T10:08:26.757 に答える