7

CXF を使用して SOAP クライアント クラスを生成しています。CXFのドキュメントでは、彼らは次のように書いています。

JAX-WS クライアント プロキシはスレッド セーフですか?

公式の JAX-WS の回答: いいえ。JAX-WS 仕様によると、クライアント プロキシはスレッド セーフではありません。移植可能なコードを作成するには、それらを非スレッド セーフとして扱い、アクセスを同期するか、インスタンスのプールなどを使用する必要があります。

CXF の回答: CXF プロキシは、多くのユース ケースでスレッド セーフです。例外は次のとおりです。

(これらのユースケースの説明は省略しています)

ほとんどの「単純な」ユース ケースでは、複数のスレッドで CXF プロキシを使用できます。上記は、その他の回避策の概要です。

逆の経験をした人はいますか?よくある質問に記載されていないマルチスレッドの問題に遭遇しましたか? それとも、それらの説明は正確で、基本的に安全に使用できますか?

4

2 に答える 2

6

私たちは最近、私たちのプロジェクトで同様の議論に遭遇しました。参照しているFAQで指定されているように、HTTPコンジットをオンザフライで変更する機能(例:セッション管理およびフェールオーバー機能)を除いて、CXFクライアントプロキシはスレッドセーフです。したがって、これらの機能を使用しない場合は、スレッド間でクライアントプロキシを共有しても問題ありません。

于 2012-10-31T11:24:27.317 に答える
1

あなたはおそらくランタイムについて言及していますが、構成時間はスレッドセーフであることを意図しているとは思いません。JettyHTTPServerEngineFactory で競合状態を見たことがあると思います。

テスト ハーネスでは、関連のない複数の SOAP サーバーを立ち上げ、それらがバスを共有している場合、複数のスレッドが JettyHTTPServerEngine インスタンスを同時に追加しようとすると、競合状態が発生する可能性があります。特定の競合状態は、ポートに HTTPS を使用する場合に呼び出す setTLSServerParametersForPort() にあります。このメソッドは、ロックなしで要素を HashMap に追加します。

他の人がこれに遭遇しない理由は、ほとんどの人が構成ファイルを介して CXF を構成し、1 つのプロセスで複数のポート/Jetty サーバーを使用することはめったにないためだと思います。

于 2014-08-01T16:27:06.327 に答える