Webリソースクライアント実装時の注意事項について説明します。
Clientオブジェクトの生成には処理コストが掛かるので,一度生成したClientオブジェクトは再利用することをお勧めします。WebResourceオブジェクトを複数回生成したり,Clientクラスのメソッドを利用してWebリソースを複数回呼び出したりする場合に,Clientオブジェクトを複数回生成する必要はありません。
同様に,WebResourceの生成にも処理コストが掛かるので,一度生成したWebResourceオブジェクトは再利用することをお勧めします。同じWebリソース(URL)に対するHTTPリクエストやビルダを複数回生成する場合に,WebResourceオブジェクトを複数回生成する必要はありません。
ただし,Clientクラスの設定を行うメソッドや,オブジェクトを破棄するClientクラスのメソッドはスレッドセーフではありません。次の内容に注意してください。
複数スレッドの動作中にこれらの操作を行った場合,通信が失敗したり,不正なHTTPリクエストが送信されたりすることがあります。
WebリソースクライアントをサーブレットやEJBなどで実装する場合は,サーブレットやEJBなどの初期化メソッドでClientオブジェクトを生成し,必要な設定を行ってください。Clientオブジェクトの破棄についても同様に,破棄メソッドでClientオブジェクトの破棄を行ってください。
サーブレットでRESTful Webサービス用クライアントAPIを利用する例を次に示します。
@WebServlet("/example") |
RESTful Webサービス用クライアントAPIのスレッドセーフ性の詳細については,「25.16 RESTful Webサービス用クライアントAPIのスレッドセーフ性」を参照してください。
プロキシ,SSL接続,およびベーシック認証の設定については,それぞれ次の個所を参照してください。
Webリソースクライアントから大量のリクエストを送信するような環境では,次の例外が記録されることがあります。
java.net.BindException: Address already in use: connect [errno=10048, syscall=select] |
この例外は,例えばサーブレットとして実装したWebリソースクライアントに対して大量のリクエストが到着したときなどに発生します。
このような場合は,次に示すどちらか,または両方の対策を実施してください。
ただし,OSのバージョンやエディション,セキュリティ更新プログラムの適用状況によって仕様が異なるため,詳細については各OSのドキュメントを参照してください。また,これらの設定はOS全体に影響が及ぶため,注意が必要です。
Webリソースクライアント側のJAX-RSエンジンは,JDKのHTTPクライアント実装を利用して通信しています。JDKのHTTPクライアント実装は,RFC 2616に反してHTTP通信でエラーが発生し,サーバから正しいレスポンスを受け取れなかった場合,一度だけリクエストを再送します。JDKのシステムプロパティを使用するとリクエストの再送を抑止できます。詳細は,「10.20 sun.net.www.http.HttpClientによるリクエスト再送抑止」を参照してください。なお,参照する場合は「Webサービスクライアント」を「RESTful Webサービスクライアント」に,「JAX-WSエンジン」を「JAX-RSエンジン」に読み替えてください。
コマンドラインで動作するJavaアプリケーションをクライアントアプリケーションとして利用するときに必要な設定,コマンドラインの指定例,注意事項については,「10.14 コマンドラインを利用したクライアントアプリケーションの実行」を参照してください。なお,RESTful Webサービスクライアントでは,Javaアプリケーション用オプション定義ファイルに次のキーと値も追加してください。
add.class.path=<インストールディレクトリ>/jaxws/lib/cjjaxrs.jar |