ページの先頭行へ戻る
Interstage Service Integrator V9.5.0 アプリケーション開発ガイド
FUJITSU Software

D.4.1 Interstage Application Server

例をもとに、Interstage Application Server利用時にSOAPのRPC機能(JAX-RPC)を、スタブで利用するアプリケーションの開発手順を説明します。
アプリケーションの開発は、以下の手順で行います。

注意

スタブを作成するためには、Interstage Studioが利用できる環境が必要となります。
Windowsシステム上でワークベンチを使って、アプリケーションを開発します。

開発したアプリケーションの実行資源を、実行環境であるSolaris、またはLinuxシステムに配備し、運用してください。詳細は、“Interstage Studio ユーザーズガイド”を参照してください。

図:開発の手順

手順

  1. アクセス先のISIサーバで用意されているWSDLファイル(ESIService.wsdl)を取得し、任意のディレクトリに格納します。

    例)“C:\WSDL\ESIService.wsdl”

    注意

    ISIのWSDLファイルの取得方法は、ISIサーバの運用管理者に問い合わせてください。

  2. ワークベンチを起動し、メニューから[ファイル]-[新規]-[プロジェクト]を選択します。
    [新規プロジェクト]ウィザードが表示されます。

  3. [Javaアプリケーションプロジェクト]を選択し、[次へ]ボタンをクリックします。
    [新規Javaアプリケーションプロジェクト]画面が表示されます。

  4. [プロジェクト名]に任意のプロジェクト名(例:“ESIClientSampleProject”)を指定し、[内容]に[ワークスペース内に新規プロジェクトを作成]をチェックします。
    [JRE]に[デフォルトJREの使用]にチェックし、[終了]ボタンをクリックします。
    [関連付けられたパースペクティブを開きますか?]ダイアログが表示されます。
    [いいえ]を選択します。初期状態が、J2EEパースペクティブ以外の場合は、J2EEパースペクティブに変更してください。

  5. Webサービスクライアントを開発するためのクラスパスを設定するため、作成したプロジェクト(ESIClientSampleProject)を選択して、右クリックでコンテキストメニューを表示し、[ビルドパス]-[ライブラリの追加]を選択します。
    [ライブラリの追加]ウィザードが表示されます。

  6. [Interstage J2EEライブラリ]を選択し、[次へ]ボタンをクリックします。

  7. 表示された画面で[J2EEアプリケーションからWebサービスを呼び出す]をチェックし、[終了]ボタンをクリックします。

  8. メニューから[ファイル]-[新規]-[Webサービスクライアント]を選択します。
    J2EEパースペクティブ以外の場合には、[ファイル]-[新規]-[その他]を選択し、新規ウィザードから、[J2EE]-[Webサービスクライアント]を選択します。
    [Webサービスクライアント生成]ウィザードが表示されます。

  9. 以下を指定し、[終了]ボタンをクリックします。

    • ソースディレクトリ:ESIClientSampleProject/src

    • WSDLファイル:手順1で取得したWSDLファイル“C:\WSDL\ESIService.wsdl”

    • ユーザ定義クラスを生成する:(チェック)

  10. メニューから[ファイル]-[新規]-[クラス]を選択します。
    [Javaクラス]ウィザードが表示されます。

  11. 以下を指定し、[終了]ボタンをクリックします。

    • ソースディレクトリ:ESIClientSampleProject/src

    • パッケージ:sample

    • エンクロージング型:チェックしない

    • 名前:ESIClientSample

    • 修飾子:public

    • スーパークラス:java.lang.Object

    • インタフェース:指定しない

    • 作成するメソッドスタブの選択:[public static void main(String[] args)]をチェック、[継承された抽象メソッド]をチェック

    • 現在のプロジェクトのプロパティで構成したとおりコメントを追加:チェックしない

  12. 以下のファイルが生成されたことを確認します。

    • “sample\ESIClientSample.java”

    • “ESIServer\_isws_ESIServerPortSoapBindingStub.java”

    • “ESIServer\_isws_ESIServerServiceLocator.java”

    • “ESIServer\ESIServerPortType.java”

    • “ESIServer\ESIServerService.java”

    • “com\fujitsu\esi\client\_isws_ESIJMSReceiveFilter_Helper.java”

    • “com\fujitsu\esi\client\ESIJMSReceiveFilter.java”

    • “com\fujitsu\esi\message\_isws_ESIAttachment_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIBytePayload_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIFunction_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIHeader_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIHistoryInfo_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIMessage_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIParameter_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIParameterItem_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESIPayload_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESISequence_Helper.java”

    • “com\fujitsu\esi\message\_isws_ESISequenceLogInfo_Helper.java”

    • “com\fujitsu\esi\message\ESIAttachment.java”

    • “com\fujitsu\esi\message\ESIBytePayload.java”

    • “com\fujitsu\esi\message\ESIFunction.java”

    • “com\fujitsu\esi\message\ESIHeader.java”

    • “com\fujitsu\esi\message\ESIHistoryInfo.java”

    • “com\fujitsu\esi\message\ESIMessage.java”

    • “com\fujitsu\esi\message\ESIParameter.java”

    • “com\fujitsu\esi\message\ESIParameterItem.java”

    • “com\fujitsu\esi\message\ESIPayload.java”

    • “com\fujitsu\esi\message\ESISequence.java”

    • “com\fujitsu\esi\message\ESISequenceLogInfo.java”

  13. アプリケーションを作成します。

アプリケーションの例:サンプルプログラム“ESIClientSample.javaを例にあげて説明します。

注意

ISI 8.0以降では、WSDLファイルが変更されています。ISI 7.0で提供しているWSDLファイルを用いてアプリケーションを作成している場合、アプリケーションを修正する必要があります。詳細は、“D.4.3 アプリケーションの移行”を参照してください。

以下のサンプルプログラム“ESIClientSample.java”の斜体部分は、同期送信サービスの呼出し例です。

package sample;

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;

import javax.xml.rpc.ServiceFactory;
import com.fujitsu.esi.client.*;
import com.fujitsu.esi.message.*;
import ESIServer.ESIServerPortType;
import ESIServer.ESIServerService;

public class ESIClientSample{
      public ESIClientSample() {
            super();
      }

       public void run(String[] args) {
       //(13)アプリケーション実行時に実行されるコードを下に追加します
         try {
           ServiceFactory serviceFactory = ServiceFactory.newInstance();
           ESIServerService service
           = (ESIServerService) serviceFactory.loadService(ESIServerService.class);
           ESIServerPortType esiSv = service.getESIServerPort(); ……(a)

           ESIMessage reqmsg = new ESIMessage(); ……(b)
           ESIParameter param = reqmsg.getHeader().getParameter();
           //シーケンス名設定
           ESIParameterItem[] items = new ESIParameterItem[1];
items[0] = new ESIParameterItem();
items[0].setKey("com.fujitsu.esi.sequence.name");
items[0].setValue("sample_sequence");
param.setItems(items); //Webサービスの呼出し
ESIMessage rspmsg = esiSv.sendESIMsgSync(reqmsg ); ……(c) //戻り値ESIMessageの処理結果シーケンス名取得 String status = null;
String sequenceName = null; ESIParameterItem[] resultItems
= rspmsg.getHeader().getParameter().getItems(); for( int i= 0; i < resultItems.length; i++){
if(
resultItems[i].getKey().equals("com.fujitsu.esi.status") ){ ……(d) status = resultItems[i].getValue(); } else if( resultItems[i].getKey().equals("com.fujitsu.esi.sequence.name") ){ sequenceName = resultItems[i].getValue(); break; }
}
} catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } public static void main(String[] args) { ESIClientSample object = new ESIClientSample(); object.run(args); } }
  1. 送信先WebサービスのURLの指定には、2通りの方法があります。

    • 手順1で取得したWSDLファイルに記述されている送信先WebサービスのURLに送信する場合、パラメタなしでスタブオブジェクトを作成します。(サンプルプログラム“ESIClientSample.java”の方法)

    • 手順1で取得したWSDLファイルに記述されている送信先WebサービスのURLとは異なるURLに送信する場合、スタブオブジェクトに対してプロパティで設定します。
      例:
      ESIServerPortType esiSv = service.getESIServerPort();
      ((Stub) esiSv)._setProperty("javax.xml.rpc.service.endpoint.address", "送信先URL");
      ※ javax.xml.rpc.Stubをimportする必要があります。

  2. 注意事項を参照してください。

  3. ISIがWebサービスとして提供しているメソッドは、以下のとおりです。

    • 同期送信サービス:sendESIMsgSync(ESIMessage)

    • 非同期送信サービス:sendESIMsgAsync(ESIMessage)

    • 非同期受信サービス:receiveESIMsgAsync(ESIJMSReceiveFilter, Queue名)

    ポイント

    送信先URLには、ISIのJAX-RPC用のURLを指定します。
    SOAPのRPC機能(JAX-RPC)の設定については、“ISI 導入ガイド”を参照してください。

注意

メッセージ送受信APIを利用した送信用メソッドは同一ですが、スタブを利用した送信用のメソッドは異なります。

各メソッドを呼び出す場合、共通メッセージ(ESIMessage)に設定が必要な項目を以下に示します。

表D.2 共通メッセージ(ESIMessage)に設定が必要な項目

メソッド名

キュー名

シーケンス名

sendESIMsgSync(ESIMessage)

sendESIMsgAsync(ESIMessage)

○:ESIMessageに設定必須
△:ESIMessageに設定可(省略時は、デフォルト値が有効となります。)
-:ESIMessageに設定不要(設定は無効となります。)

共通メッセージの作成方法については、“D.5 共通メッセージの作成・操作”を参照してください。

  1. 以下のキー名を指定して値を取得すると、ISI呼出し結果情報やエラーが発生した原因情報を取得できます。

    表D.3 キー名と取得情報

    キー名

    情報

    com.fujitsu.esi.status

    ISIの処理結果です。

    SUCCESS
    処理が正常終了した場合

    FAILURE
    処理中にエラーが発生した場合

    com.fujitsu.esi.error.code

    ISIの処理中に最初に発生したエラーのエラーコードです。

    com.fujitsu.esi.error.stepname

    エラーが発生したステップです。
    ISIの初期処理中にエラーが発生した場合は、nullになります。

    com.fujitsu.esi.error.methodtype

    エラーが発生したメソッド種別です。
    ISIの初期処理中にエラーが発生した場合は、nullになります。
    その他の場合はinit、execute、cancel、destroyのどれかになります。

    com.fujitsu.esi.error.handle.status

    ISI処理のエラー発生時に呼び出したシーケンスの処理結果です。

    SUCCESS
    処理が正常終了した場合

    FAILURE
    処理中にエラーが発生した場合

    com.fujitsu.esi.error.handle.code

    エラー発生時に呼び出したシーケンスの中で、最初に発生したエラーのエラーコードです。

    com.fujitsu.esi.error.handle.stepname

    エラー発生時に呼び出したシーケンスの中で、エラーが発生したステップです。
    エラー発生時、シーケンスの初期処理中にエラーが発生した場合は、nullになります。

    com.fujitsu.esi.error.handle.methodtype

    エラー発生時に呼び出したシーケンスの中で、エラーが発生したメソッド種別です。
    エラー発生時、シーケンスの初期処理中にエラーが発生した場合は、nullになります。
    その他の場合はinit、execute、cancel、destroyのどれかになります。

注意事項

ESIMessageの要素を初期化するためには、以下の設定が必要です。

ESIMessage reqmsg = new ESIMessage();

ESIHeader header = new ESIHeader();
ESIParameter parameter = new ESIParameter();
ESIParameterItem[] items= new ESIParameterItem[0];
parameter.setItems(items);
header.setParameter(parameter);

ESISequence sequence = new ESISequence();
ESISequenceLogInfo[] sequenceLogList = new ESISequenceLogInfo[0];
sequence.setSequenceLogInfoList(sequenceLogList);
ESIFunction[] fuctionList = new ESIFunction[0];
sequence.setFunctionList(fuctionList);

ESIBytePayload objectPayload = new ESIBytePayload();

ESIPayload payload = new ESIPayload();
payload.setBytePayload(objectPayload);
ESIAttachment attachment = new ESIAttachment();
ESIBytePayload[] bytePayload = new ESIBytePayload[0];
attachment.setBytePayloadList(bytePayload);
payload.setAttachment(attachment);
header.setSequence(sequence);

reqmsg.setHeader(header);
reqmsg.setPayload(payload);

サンプルプログラム“ESIClientSample.java”で呼出し例をあげた同期送信サービス以外の各メソッドの呼出し例を、以下に示します。サンプルプログラム“ESIClientSample.java”の斜体の部分を置き換えてください。

非同期送信サービス:sendESIMsgAsync(ESIMessage)

ESIMessage reqmsg = new ESIMessage();

ESIParameter param = reqmsg.getHeader().getParameter();
//キュー名、シーケンス名設定

ESIParameterItem[] items= new ESIParameterItem[2];
items[0] = new ESIParameterItem();
items[0].setKey("com.fujitsu.esi.queue.name");
items[0].setValue("sampleQueue");

items[1] = new ESIParameterItem();
items[1].setKey("com.fujitsu.esi.sequence.name");
items[1].setValue("sample_sequence");

param.setItems(items);

       
//Webサービスの呼出し ESIMessage rspmsg = esiSv.sendESIMsgAsync(reqmsg); //戻り値ESIMessageのシーケンス名、キュー名取得 String sequenceName = null; String queueName = null; ESIParameterItem[] resultItems = rspmsg.getHeader().getParameter().getItems(); for( int i= 0; i < resultItems.length; i++){ if( resultItems[i].getKey().equals("com.fujitsu.esi.sequence.name") ){ sequenceName = resultItems[i].getValue(); }else if( resultItems[i].getKey().equals("com.fujitsu.esi.queue.name") ){ queueName = resultItems[i].getValue(); } }

非同期受信サービス:receiveESIMsgAsync(ESIJMSReceiveFilter, Queue名)

ESIJMSReceiveFilter fltr= new ESIJMSReceiveFilter();
//クエリ設定
fltr.setQuery("sampleKey='SampleValue'"); ……(a)
//キュー名設定
String queue = "sampleQueue";

      
//Webサービスの呼出し ESIMessage rspmsg = esiSv.receiveESIMsgAsync(fltr , queue); //戻り値ESIMessageのキュー名取得 String queueName = null; ESIParameterItem[] resultItems = rspmsg.getHeader().getParameter().getItems(); for( int i= 0; i < resultItems.length; i++){ if( resultItems[i].getKey().equals("com.fujitsu.esi.queue.name") ){ queueName = resultItems[i].getValue(); break; } }

ESIJMSReceiveFilterにクエリを設定しない場合は、キューの先頭に格納されている共通メッセージを受信します。

Basic認証、接続タイムアウト時間、セション管理の設定

Basic認証、接続タイムアウト時間、セション管理の設定は、スタブオブジェクトのプロパティで設定します。

例:サンプルプログラム“ESIClientSample.java”をもとに、各設定方法を以下に示します。

                    :
import javax.xml.rpc.Stub;

public void run(String[] args){
       //アプリケーション実行時に実行されるコードを下に追加します
         try {
           ServiceFactory serviceFactory = ServiceFactory.newInstance();
           ESIServerService service
           = (ESIServerService) serviceFactory.loadService(ESIServerService.class);
           ESIServerPortType esiSv = service.getESIServerPort;
            //Basic認証:ユーザ名、パスワード
            ((Stub) esiSv)._setProperty("javax.xml.rpc.security.auth.username", "username");
             ((Stub) esiSv)._setProperty("javax.xml.rpc.security.auth.password", "password");

            //接続タイムアウト時間の設定
             ((Stub) esiSv)._setProperty("com.fujitsu.interstage.isws.client.connect.timeout", new Integer(6000));

            //セション管理の設定
             ((Stub) esiServer)._setProperty("javax.xml.rpc.session.maintain", Boolean.TRUE);
                    :
表D.4 プロパティ値

プロパティ名

備考

javax.xml.rpc.security.auth.username

(java.lang.String)
Basic認証ユーザ名
例)username

  

javax.xml.rpc.security.auth.password

(java.lang.String)
Basic認証パスワード
例)password

  

com.fujitsu.interstage.isws.client.connect.timeout

(java.lang.Integer)
接続先から応答がない場合、接続を切断するタイムアウト時間(ミリ秒)(※1)
例)60000

デフォルト値:600000(10分)

javax.xml.rpc.session.maintain

(java.lang.Boolean)
以下のどちらかを指定します。

Boolean.TRUE
セション管理を利用する

Boolean.FALSE
セション管理を利用しない

デフォルト値:Boolean.FALSE

※1:タイムアウト時間がISIサーバの処理時間より短い場合、接続タイムアウトが発生します。接続タイムアウトが発生すると、クライアント側でエラーになったり、データが消失したりする可能性があるため、タイムアウト時間は、ISIサーバの処理時間より長めに設定してください。

Proxyの設定

プロキシ情報は、アプリケーション実行時のJavaVMオプションからシステムプロパティに設定します。

例:ESIClientSample.java

java
-Dhttp.proxyHost=proxy.proxyhost.com
-Dhttp.proxyPort=8080
-Dhttp.nonProxyHosts=localhost|*.myhost.com
-Dhttp.proxyUser=proxyUserName
-Dhttp.proxyPassword=proxyPassword
ESIClientSample

表D.5 プロパティ値

プロパティ名

備考

http.proxyHost

プロキシサーバのホスト名
例)proxy.proxyhost.com

値が設定されていない場合は、プロキシを経由せずに接続を行います。

http.proxyPort

プロキシサーバのポート番号
例)8080

SSLを使用しない場合
値が設定されていない場合は、プロキシを経由せずに接続を行います。

SSLを使用する場合
省略値は“80”です。(http.proxyHostが指定された場合)

http.nonProxyHosts

プロキシを経由せずに接続するホスト名
例)localhost|*.myhost.com

“|”区切りで複数のホスト名を指定できます。

http.proxyUser

プロキシサーバのログインユーザ名
例)proxyUserName

プロキシがBasic認証を行っている場合に設定してください。

http.proxyPassword

プロキシサーバのログインパスワード
例)proxyPassword

プロキシがBasic認証を行っている場合に設定してください。

SSLの設定

クライアント認証なしの場合、以下の手順で設定します。

  1. 動作環境の設定

  2. 証明書環境の構築

    1. 証明書の登録・管理用ファイルを配置するディレクトリの作成

    2. 証明書管理ファイルの作成

    3. サーバのサイト証明書を登録している認証局からの認証局証明書取得

    4. 認証局証明書の登録

    5. 証明書管理ファイルの作成

  3. SSL定義の作成

  4. クライアントアプリケーションの設定

クライアント認証ありの場合、以下の手順で設定します。

  1. 動作環境の設定

  2. 証明書環境の構築

    1. 証明書の登録・管理用ファイルを配置するディレクトリの作成

    2. 証明書管理ファイルの作成

    3. 証明書発行要求の作成

    4. 証明書の発行依頼

    5. 認証局から証明書の取得

    6. 認証局から発行された証明書の登録

    7. 認証局から発行されたサイト証明書の登録

  3. SSL定義の作成

  4. クライアントアプリケーションの設定

SSLの設定方法の詳細については、“Interstage Application Server セキュリティシステム運用ガイド”、“Interstage Application Server J2EE ユーザーズガイド(旧版互換)”を参照してください。