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