0

私が継承したコードベースには、その でファクトリ参照を取得するためにMDB呼び出している があり、このファクトリから特定の Bean を取得してインスタンス変数として格納しています。(ファクトリのタイプは ' ' です)。SingletonBeanFactoryLocator().getIntance().useBean()ejbCreate()MDBClassPathXmlApplicationContext

紛らわしい部分はrelease()、その Bean が取得された後、同じ のこのファクトリ参照で' ' を呼び出していることejbCreate()です。

現在、これMDBはプールサイズ ' x' でプールされており、私が観察したところ、 で定義された Beancontext xmlが ' ' 回作成されていxます。私の推測では、「 」が実行されるたびにejbCreate()、コンテキストとその Bean が新たに作成されます。

release()上記の ' について Spring doc を確認しました。

In an EJB usage scenario this would normally be called from `ejbRemove()` and `ejbPassivate()`.

だからここに私の質問があります:

1) 本当に新しいコンテキストを作成し、新しい Beaneverytime ejbCreate()が呼び出されますか?

2) はいの場合、前の呼び出しで作成されたコンテキスト/Bean はどうなりますか (たとえば、Bean 自体がシングルトンの場合、それらは破棄されますか)?

SingletonBeanFactoryLocator3)これは、上記のコンテキストで(おそらくスレッドセーフの問題のために)使用する正しい方法ですか?

4) そうでない場合、それを使用する正しい方法は何ですか?

編集:私が考えることができる1つの可能性は、関連するBeanprototypeを作成して各MDBインスタンスをスレッドセーフにすることです。そのため、コンテキストを解放して再作成する必要はありません。他のコメント/提案を待っています。

4

1 に答える 1

1
  1. はい
  2. 何も起こりません。同じオブジェクトは引き続き同じ MDB に存在します。MDB は気にせず、この時点で Spring は対象外です。
  3. それは本当に使用状況に依存します。Spring を使用してオブジェクトをアセンブルするだけで、すべての MDB に独自のインスタンスが必要な場合、答えはイエスです。
  4. ユースケースに応じてSpringBeanAutowiringInterceptor、より良い代替手段となる場合とそうでない場合があります。
  5. プロトタイプは難しい場合があります。期待どおりに動作させるには、Bean とその結果をよく理解する必要があります。そのため、通常、Spring Bean をステートレスにするのが最善です。

更新: 実際には競合状態があります。コンテナーがejbCreate()2 つの MDB を並行して実行することを決定した場合、両方が同じアプリケーション コンテキストを共有することになります。

更新 2: 並列スレッドによる EJB の作成を明示的に許可するセクションは見つかりませんでしたが、それを明示的に禁止するセクションも見つかりませんでした。

仕様の次のセクションを考えると、仕様の精神に沿っていると思います。


2.4.2 メッセージ駆動型オブジェクト

一般的な EJB コンテナは、多数のメッセージ駆動型オブジェクトを同時に実行するためのスケーラブルなランタイム環境を提供します。

5.2 目標

メッセージ駆動型 Bean モデルのもう 1 つの目標は、コンテナが提供するメッセージ駆動型 Bean インスタンスのプーリングによって、メッセージ ストリームの同時処理を可能にすることです。

5.4 メッセージ駆動型 Bean インスタンスとそのコンテナ間のプロトコル

コンテナーの起動時にメッセージ駆動型 Bean が存在すること、およびメッセージの配信が開始される前に Bean のインスタンスが非同期メッセージ配信を受け取る準備ができていることを確認するのは、コンテナーの責任です。

5.4.11 メッセージ処理の並行性

A container allows many instances of a message-driven bean class to be executing concurrently, thus allowing for the concurrent processing of a stream of messages. No guarantees are made as to the exact order in which messages are delivered to the instances of the message-driven bean class, although the container should attempt to deliver messages in order when it does not impair the concurrency of mes- sage processing.

于 2012-08-03T12:47:45.410 に答える