Hitachi

Cosminexus V11 アプリケーションサーバ Webサービス開発ガイド


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サービスクライアントの実装例

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オブジェクトの生成,またはポートの取得を実施し,再利用してください。ポートの要求コンテキストのプロパティに対する変更も,それぞれの初期化メソッドで実行してください。