2011-06-29 4 views
2

以下のシナリオが可能ですか?@ sessionscoped Beanで@ Observe?

ステートレスEJBである「SessionService」は、イベント「LoggedInEvent」を起動します。 LoggedInEventを監視する非静的メソッドを持つSessionScoped(Weld)Bean "SessionBean"が呼び出され、その特定のユーザーのためにいくつかのものが初期化されます。

"SessionBean"の正しいインスタンスが呼び出されていますか?すべてのインスタンスが呼び出されますか?私はドキュメントで何も見つけることができません。

答えて

6

「正しいインスタンス」は、やや誤解を招く言葉です。

これで何が起こるか:

  1. SessionServiceは、(おそらくWebリクエストによってトリガー)が呼び出されます。
  2. LoggedInEventが発生すると、登録されているすべてのオブザーバが同期方式で呼び出されます(つまり、すべてのオブザーバが終了する前にSessionServiceは終了しません)。
  3. (静的ではない)オブザーバーメソッドを含む各Beanがインスタンス化されます(Beanスコープがアクティブである場合 - 通常は標準のWeb環境(*)にあります)。これはあなたのSessionBeanの場合です。 - SessionBeanがアクティブなセッションにすでにのインスタンスが設定されている場合(ただし、Webリクエストに関しては1つのセッションしかアクティブではありません)、このインスタンスはもちろん使用されます。

詳細はspecです。

質問に答えてください:

はい、正しいインスタンスが呼び出されます。どうして?アクティブなセッションスコープに関連付けられているインスタンスが1つだけであることを確認するのは、コンテナの責任です。

(*):例えば、リモートejbコールによって起動された場合、アクティブなセッションもアクティブな会話も想定できません。

関連する問題