5

wsimport を使用して、非同期 Web サービス呼び出しを持つ Web サービス クライアント アーティファクトを作成する方法を説明しているYoung Yang による優れた記事があります。非同期では、WSDL にタグが含まれている必要があります

<enableAsyncMapping>true</enableAsyncMapping>

そのバインディングセクションで。JAX-WS アノテーション付き Java クラスでボトムアップ アプローチを使用している場合、WSDL は Web サーバー上で生成されたアーティファクトであるため、これを直接 WSDL で行うことはできません。代わりに、Ant や Maven などのビルド ツールを使用して、wsimport が WSDL で実行されるときにこのバインディングを含めます。

生成されたクライアント アーティファクトには、

Future<?>

または

Response

これは未来です。

Yang の記事を読んだ後の私の質問は、エグゼキューターとフューチャーを使用して、独自の非同期 Web サービス呼び出しをロールしない理由です。wsimport によって作成されたアーティファクトには、ロール ユア オウン アプローチでは見られない利点がありますか?

両方のアプローチの経験や洞察をお持ちの方がいらっしゃいましたら、フィードバックをいただければ幸いです。

4

2 に答える 2

12

理論的には、生成された非同期クライアントはスレッドをブロックする必要はありません。AsyncHandler を渡すことで、システムは NIO を使用して、Web サービスの呼び出しが完了したときにイベントを登録し、そのハンドラーを呼び出すことができます。スレッドをブロックする必要はまったくありません。

同期Web サービス呼び出しをエグゼキューターに入れると、結果が到着するまでスレッドをブロックすることになりますが、少なくともこのブロックはエグゼキューターのスレッド プールに限定されます。

何百ものスレッドが浮かんでいるとすぐに、コンテキストの切り替えによりシステムのパフォーマンスが低下します。

内部の Web サービス ライブラリが実際に NIO を使用しているかどうかは別の問題です。JAX-WS 仕様では必須ではないようです。JDK 1.6 を使用し、サーバー側にブレーク ポイントを設定して、サーバーを呼び出すために 100 のクライアントをオフに設定しました。JVisualVM を使用してクライアントにアタッチすると、サーバーへの呼び出しごとに 1 つの新しいスレッドが作成されていることがわかりました。ごみ!

Web を調べてみると、非同期呼び出しで使用されるスレッドのプールの制限を Apache CXF がサポートしていることがわかりました。案の定、CXF で生成されたクライアントを使用し、ここで説明したように適切なライブラリをクラスパスに配置すると、再テストでは 25 スレッドしか使用されていないことが示されました。

では、独自の API を構築するのではなく、なぜ jax-ws API を使用するのでしょうか? 独自のものを構築するにはより多くの作業が必要になるため ;-)

于 2012-10-01T21:37:28.757 に答える