2011-07-08 1 views
12

Webサービスクライアントサービスインスタンスを作成するのにどれくらいの費用がかかりますか?Webservice - クライアントサービスインスタンス化

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

マルチスレッド環境(webapp)で同じポートを再利用した後でサービスを作成することは危険ですか?

ポートgetPortとポート自体はスレッドセーフではありませんが、コストのかかる操作であれば問題が発生する可能性があるたびにサービスを作成します。

あなたはJAX-WSを使用している場合

おかげ

答えて

12

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

SomePortの最初の作成は非常に高価です(約200ms)。同じJavaWebServiceインスタンス上のgetSomePort()へのその後のコールは、実質的に速い(約3ms)。

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

しかし、SomePortのメソッドはスレッドセーフではありませんが、JavaWebServiceのメソッドはあります。したがって、合理的な使用パターン(少なくともメトロスレッドセーフでは実装仕様が多少不足しているため)はJavaWebServiceを再利用するのは、高価なgetSomePort()コールを1度だけ実行することになります。

更新

これはServiceオブジェクトについて書いたアンドレアスLeow、オラクルドイツから従業員、下記のコメントに@PapaLazarouが参照するスレッドでのポスターの一つ、によって2つのポスト、

と一致

WSDLごとにただ1つのスタティックServiceインスタンスを作成できます。単一のServiceオブジェクトは完全にスレッドセーフで、任意の数の同時スレッドで共有できます。

とポートの使用状況について、

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

+2

これについての参考情報はありますか?これまでに返されたポートはスレッドセーフではなく、CXFのページでは「クライアント」(私はそれらがポートを意味すると仮定していると仮定しています)はスレッドセーフではありません。私が探しているのは、メトロサービス(ポートではない)がスレッドセーフであること、特に 'getPort'を呼び出すことで個別のインスタンスが返されるという公式のステートメントです。 –

+1

メトロ開発者がこれを示した数多くの投稿を見つけましたが、それらを再度見つけるのに苦労しました。私が最近見つけた唯一の記事は[this](http://metro.1045641.n5.nabble.com/JAX-WS-clients-td5709817.html)です。参考までに、私の独立した同時テストでも、これが該当することが示されました。 – PapaLazarou

4

は、あなたは(彼らはスレッドセーフではありません)スレッド間でポートを共有することはできません。ポートの作成によるオーバーヘッドが懸念されている場合(ポートを測定してアプリケーションでボトルネックになっていることを確認した場合)、ポートの接続プールを作成できます。

+0

私はcxfサイトではスレッドセーフではなく、スレッドセーフなgetPortを提供していると読んでいます...しかし、私はMEtroスタックJaxWSを使用しています。 (いくつかのテストを開始するが、ホイールを再開発したくない) – Cris