9.16. Web サービスのクライアント

9.16.1. サービス

Service は WSDL サービスを表す抽象になります。 WSDL サービスは関連ポートの集合で、 それぞれが特定のプロトコルにバインドするポートタイプから構成されます。 また、特定のエンドポイントアドレスで使用可能になります。
ほとんどのクライアントの場合、 WSDL から生成されるスタブセットを使って開始します。 これらのうちのひとつはサービスになり、 そのサービスと動作させるためにそのクラスのオブジェクトを作成します (以下の 「静的な場合」 を参照)。

9.16.1.1. サービスの使用

静的な場合

ほとんどのクライアントは WSDL ファイルで開始し、 wsconsume のような jbossws ツールを使っていくつかのスタブを生成します。 これは通常、 膨大なファイル数となり、 そのうちのひとつがツリーのトップになります。 これがサービス実装クラスです。

生成される実装クラスは、1 つは引数なしでもうひとつは 2 つの引数を持ちそれぞれ wsdl の場所 (java.net.URL) とサービス名 (jvax.xml.namespace.QName) を表す 2 つのパブリックコンストラクターを持つことになると認識できます。
通常、 引数なしのコンストラクタを使用します。 この場合、 WSDL の場所とサービス名は WSDL にあります。 これらは生成されるクラスを修飾する WebServiceClient アノテーションから黙示的に設定されます。
次のコードスニペットは生成されたクラスから生成されるコンストラクターを示しています。
// Generated Service Class
  
@WebServiceClient(name="StockQuoteService", targetNamespace="http://example.com/stocks", wsdlLocation="http://example.com/stocks.wsdl")
public class StockQuoteService extends javax.xml.ws.Service 
{

   public StockQuoteService() 
   {
      super(new URL("http://example.com/stocks.wsdl"), new QName("http://example.com/stocks", "StockQuoteService"));
   }
  
   public StockQuoteService(String wsdlLocation, QName serviceName) 
   {
      super(wsdlLocation, serviceName);
   }
  
   ...
}
ダイナミックプロキシ の章には、サービスからのポート取得方法やポート上での操作の呼び出し方法について説明されています。XML ペイロードを直接作業する必要がある場合や SOAP メッセージ全体の XML 表記を作業する必要がある場合は、ディスパッチ をご覧ください。
動的な場合

動的な場合、 何も生成されないと Web サービスクライアントは Service.create を使って Service インスタンスを作成します。 次のコードでこのプロセスを示します。

URL wsdlLocation = new URL("http://example.org/my.wsdl");
QName serviceName = new QName("http://example.org/sample", "MyService");
Service service = Service.create(wsdlLocation, serviceName);
このような JBossWS の使用方法は推奨されていません。

9.16.1.2. ハンドラーリゾルバー

JAX-WS はハンドラーとして知られるメッセージ処理モジュール用の柔軟なプラグインフレームワークを提供しており、 JAX-WS ランタイムシステムの機能拡張に使用することができます。 Handler Framework ではハンドラーフレームワークについて詳細に説明されています。 Service インスタンスは、 サービス毎やポート毎、 プロトコルバインディング毎にハンドラーセットを設定することができる getHandlerResolver メソッドと setHandlerResolver メソッドのペアで HandlerResolver へのアクセスを提供します。
Service インスタンスがプロキシまたは Dispatch インスタンスの作成に使用されると、 現在そのサービスで登録されているハンドラーリゾルバーが要求されるハンドラーチェーンの作成に使用されます。続いて起こる Service インスタンス用に設定されるハンドラーリゾルバーへの変更は前に作成されたプロキシあるいは Dispatch のインスタンスにあるハンドラーには影響しません。

9.16.1.3. Executor

Service インスタンスは java.util.concurrent.Executor で設定することができます。 次にエグゼキューターを使ってアプリケーションが要求するすべての非同期のコールバックが呼び出されます。ServicesetExecutorgetExecutor のメソッドを使ってサービス用に設定されるエグゼキューターを編集して読み出すことができます。