14

Webサービスクライアントサービスインスタンスを作成するのにどれほどの費用がかかるか知っていますか?

 JavaWebService service = new JavaWebService();
 SomePort port = service.getJavaWebServicePort(); 

サービスを一度作成し、その後マルチスレッド環境(webapp)で同じポートを再利用することは危険ではありませんか?

ポートgetPortとポート自体はスレッドセーフではありませんが、サービスを作成するたびに、コストのかかる操作である場合に問題が発生する可能性があることをお読みください。

何か案が ?

ありがとう

4

2 に答える 2

16

JAX-WSリファレンス実装(Metro)では、の作成JavaWebServiceは安価です(生成されたクライアントでは、これには約20ミリ秒かかる傾向があります)。

の最初の作成SomePortは非常に高価です(私たちにとっては約200ms)。getSomePort()同じインスタンスでの後続の呼び出しJavaWebServiceは大幅に高速です(約3ミリ秒)。

したがって、JavaWebService取得する必要があるたびに作成する実装にはSomePort、ある程度の費用がかかります。要するに、質問への答えは「かなり高価」です。

ただし、上のメソッドSomePortはスレッドセーフではありませんが、上のメソッドはスレッドセーフJavaWebServiceです。したがって、賢明な使用パターン(少なくともMetroでは、仕様がやや不足しているため、スレッドセーフは実装固有です)は、高価な呼び出しが1回JavaWebServiceだけ発生するため、再利用することです。getSomePort()

アップデート

これは、OracleGermanyの従業員であるAndreasLeowによる2つの投稿と一致します。これは、以下のコメントで@PapaLazarouが参照しているスレッドの投稿者の1人で、Serviceオブジェクトに関して次のように書いています。

ServiceWSDLごとに1つの静的インスタンスのみを作成できます。単一のServiceオブジェクトは完全にスレッドセーフであり、必要な数の同時スレッドで共有できます。

ポートの使用法については、

CXF JAX-WSポートはスレッドセーフであるとほぼ100%確信していますが、MetroのPortオブジェクトは間違いなくスレッドセーフではありません。

于 2012-01-11T18:07:08.097 に答える
4

jax-wsを使用している場合、スレッド間でポートを共有することはできません(スレッドセーフではありません)。ポート作成のオーバーヘッドが心配な場合(そしてそれを測定し、それがアプリケーションのボトルネックであることを確認した場合)、ポートの接続プールを作成できます。

于 2011-07-08T16:50:30.567 に答える