Hitachi

Cosminexus V11 アプリケーションサーバ SOAPアプリケーション開発の手引


3.7.1 スタブの使用

生成されるスタブの内容,およびスタブを使用してSOAPサービスを呼び出す場合の実装について説明します。

〈この項の構成〉

(1) スタブの内容

WSDL2Javaコマンドで生成するファイルのうち,クライアントでは次に示すファイル(スタブ)を使用します。

表3‒23 クライアントで利用するファイル(スタブ)

ファイル名

内容

<サービス名>Locator.java

サービスクラスです。SOAPサービスへの接続情報を保持しています。

<ポートタイプ名>.java

リモートインタフェースです。SOAPサービスで利用できるメソッドを定義しています。

<データ型名>.java

ユーザ定義のデータ型クラスです。メソッドのパラメタや,パラメタのクラスで参照されるデータ型を定義しています。必要に応じて使用します。

サービス名はWSDLのwsdl:service要素のname属性の値が設定されます。ポートタイプ名はWSDLのwsdl:portType要素のname属性の値が設定されます。また,データ型名はユーザ定義のデータ型の名前に応じて設定されます。

(2) サービス呼び出し処理の実装

スタブを使用してSOAPサービスを呼び出す処理を実装します。次の例では,サービスクラスの例をUserInfoServiceLocator.java,リモートインタフェースの例をUserInfo.javaとしています。

  1. クライアントの開始処理を実行し,クライアント識別子を取得します。

    ManagementクラスおよびClientIDクラスを使用します。なお,呼び出しごとにこの操作を実行する必要はありません。

    (例)
       ClientID cltID = Management.initializeClient();

    ManagementクラスおよびClientIDクラスの使用方法については,「3.7.2 ManagementクラスとClientIDクラスの使用」を参照してください。ManagementクラスおよびClientIDクラスのAPI仕様については,「13. SOAP通信基盤が提供するAPI」を参照してください。

  2. クライアント識別子を現在のスレッドに関連づけます。

    (例)
       Management.connectClientIDtoCurrentThread(cltID);
  3. サービスクラスのオブジェクトを生成します。

    (例)
       UserInfoServiceLocator uis = new UserInfoServiceLocator();
  4. サービスクラスのオブジェクトを使用して,リモートインタフェースのオブジェクトを生成します。

    なお,生成,取得したリモートインタフェースのインスタンスは,複数のスレッドで共有できません。

    (例)
       UserInfo ui = uis.getUserInfo();

    SOAPサービスへの接続先は,WSDLのwsdl:service要素のsoap:address子要素のlocation属性となります。クライアントプログラム内でSOAPサービスへの接続先情報を取得する場合は,次のように記述します。

    (例)
       String url = uis.getUserInfoAddress();

    また,クライアントプログラム内でSOAPサービスへの接続先を変更する場合は,次のように記述します。

    (例)
       java.net.URL endpoint = new java.net.URL("http://hostname:8080/WebApp1/services/UserInfo");
       UserInfo ui = uis.getUserInfo(endpoint);
  5. リモートインタフェースのオブジェクトのメソッドを呼び出して,SOAPアプリケーションのオペレーションを実行します。

    (例)
       String name = ui.getName();

実装例の全体は,「4.1.8 クライアント側の処理を実装する」を参照してください。

なお,DeployScopeが「Session」となっているSOAPサービスを呼び出すクライアントプログラムを実装する場合,SOAPサービスのJavaインタフェースのインスタンスは,JSPやサーブレットが呼び出されるたびに,ローカル変数に生成してください。初期化や呼び出し時に,インスタンスを生成後,それをメンバ変数に退避して,複数のスレッドで共有すると,DeployScopeの「Session」が有効にならない場合があります。なお,DeployScopeが「Session」の場合は,クライアントプログラムからの呼び出し単位で,セッションが切り替わります。

このセッションは,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)」で記述している「J2EEサーバ間のセッション情報の引き継ぎ」には対応していません。