6

私はSpringWebServiceTemplateをプログラムでWebサービスクライアントとして使用しています。つまり、Springコンテナをインスタンス化することはありません。マーシャリング/アンマーシャリングにJaxb2Marshallerを使用しています。私のアプリケーションでは、SaajSoapMessageFactoryの単一のインスタンスとJaxb2Marshallerの1つのインスタンスを作成します。また、WebServiceTemplateの単一のインスタンスを作成し、以前に作成したSaajSoapMessageFactoryとJaxb2Marshallerのインスタンスを割り当てます。

私が作成したWebServiceTemplateはマルチスレッドで使用されます。つまり、複数のスレッドが同時にmarshalSendAndReceiveを呼び出すことができます。私の質問は-私の構成スレッドは安全ですか?Jaxb2Marshallerが心配です。javadocによると、Jaxb2Marshallersは必ずしもスレッドセーフではありません。Jaxbコンテキストを再初期化せずに、スレッドセーフな方法でJaxb2Marshallerを使用するにはどうすればよいですか?

余談ですが、スプリングリファレンスのspring-ws構成の例を見ると、Jaxb2Marshallerはスレッドセーフであると思いますが、Javadocはそれと矛盾しているようです。

4

3 に答える 3

7

のjavadocはJaxb2Marshaller、スレッドセーフについて何らかの形で言及していないため、なぜそうではないと思うのかわかりません。スレッドセーフでなければ、javadocはそれを非常に明確に言います。

WebServiceTemplateSaajSoapMessageFactoryおよびシングルトンの構成Jaxb2Marshallerは完全に問題なく、完全にスレッドセーフです。

于 2010-08-14T11:04:19.157 に答える
0

いくつか(たとえば5つ)を作成Jaxb2Marshallerし、それらをプールに入れます(使用LinkedBlockingQueue)。スレッドを作成するときは、キューに渡します。

スレッドが1つ必要な場合はtake()、キュー/プールから1つ。プールが空の場合、スレッドはこの呼び出しをブロックします。

スレッドの使用が完了するとJaxb2Marshallerput()他のスレッドが使用できるようにキューに戻ります。

スレッドがマーシャラーを待機する頻度が高すぎる場合は、キューにさらに追加します(最初の手順を参照)。そうすれば、プールのサイズを簡単に設定できます(または構成可能にすることもできます)。その後、キューはそれらを自動的に配布します。

于 2010-08-13T15:52:41.107 に答える