3.6.3 JAX-WS APIを使用する場合の実装例

Application ServerのJAX-WS機能がサポートしているJAX-WS APIを利用して,Webサービスクライアントを実装できます。JAX-WS APIのサポート範囲については,「19.2 APIのサポート範囲」を参照してください。

<この項の構成>
(1) JAX-WS APIを使用する場合のWebサービスクライアントの実装例
(2) javax.xml.ws.Serviceオブジェクトおよびポートの再利用

(1) JAX-WS APIを使用する場合のWebサービスクライアントの実装例

JAX-WS APIを使用したWebサービスクライアントの実装例を示します。

package com.example.sample.client;

import com.example.sample.TestJaxWs;
import com.example.sample.TestJaxWsService;

import java.net.URL;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceException;

public class TestClient {
   public static void main( String[] args ) {

       // WSDLのURLとサービス名を設定
       URL url = null;
       try {
           url = new URL("http://localhost:8085/fromwsdl/test?wsdl");
       } catch (MalformedURLException e) {
           // 例外処理
       }
       QName serviceName =
           new QName("http://example.com/sample", "TestJaxWsService");

       // Serviceインスタンスの生成
       Service service = Service.create(url, serviceName);
       System.out.println(service.getWSDLDocumentLocation());
       
       QName portName = null;
       
       // ポート名のリストを表示
       Iterator it = service.getPorts();
       while(it.hasNext()) {
           portName = (QName)it.next();
           System.out.println(portName);
       }
       
       
       // ポートの取得
       TestJaxWs port = (TestJaxWs)service.getPort(TestJaxWs.class);
       
       // 送信コンテキストの取得
       Map<java.lang.String, java.lang.Object>context =
((BindingProvider)port).getRequestContext();
       System.out.println(context.entrySet());
       
       // サービスのメソッド呼び出し
       try {
           port.jaxWsTest1( "TEST", 123);
       } catch (WebServiceException e) {
           // 例外処理
       }
   }
}

(2) javax.xml.ws.Serviceオブジェクトおよびポートの再利用

javax.xml.ws.Serviceオブジェクトの生成には処理コストが掛かるので,一度生成したjavax.xml.ws.Serviceオブジェクトは再利用することをお勧めします。ポートを取得するためにjavax.xml.ws.Serviceオブジェクトを複数回生成する必要はありません。

同様に,ポートの取得にも処理コストが掛かるので,一度取得したポートは再利用することをお勧めします。ポートのWebメソッドを複数回呼び出すためにポートを複数回取得する必要はありません。ただし,複数スレッドでポートを共有する場合,共有するポートの要求コンテキストのプロパティに対する変更は,複数スレッドが動作する前に実行してください。複数スレッドの動作中に変更すると,通信が失敗したり,不正なSOAPメッセージが送信されたりすることがあります。

WebサービスクライアントをサーブレットやEJBなどで実装する場合は,それぞれの初期化メソッドでjavax.xml.ws.Serviceオブジェクトの生成,またはポートの取得を実施し,再利用してください。ポートの要求コンテキストのプロパティに対する変更も,それぞれの初期化メソッドで実行してください。