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

D.4.2 AXIS

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

注意

スタブを作成するためには、AXISが利用できる環境が必要となります。AXISのバージョン1.3(説明:Final Version 1.3 日付:October 5, 2005)を使用してください。

図D.13 開発の手順

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

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

    注意

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

  2. AXISのコマンドを使用し、手順1で取得したWSDLファイルを利用して、クライアントスタブを自動生成します。
    なお、コマンドを実行するためには、org.apache.axis.wsdl.WSDL2Javaが実行できる環境の設定が必要です。

    java  org.apache.axis.wsdl.WSDL2Java  D:\WSDL\ESIService.wsdl ……(a)

    1. 手順1で取得したWSDLファイルを指定してください。

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

    • “com\fujitsu\esi\client\ESIJMSReceiveFilter.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\ESISequnceLogInfo.java”

    • “ESIServer\ESIServerPortSoapBinding.java”

    • “ESIServer\ESIServerPortType.java”

    • “ESIServer\ESIServerService.java”

    • “ESIServer\ESIServerServiceLocator.java”

  4. 自動生成された上記のファイルをすべて、コンパイルします。

  5. ロケータオブジェクトを作成します。

  6. プロキシオブジェクトを作成します。

  7. Webサービスを呼び出します。

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

注意

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

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

package sample;

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;

import com.fujitsu.esi.client.*;
import com.fujitsu.esi.message.*;
import ESIServer.ESIServerPortType;
import ESIServer.ESIServerService;
import ESIServer.ESIServerServiceLocator;

public class ESIClientSample {
       public static void main(String[] args){
         try {
           //(5)ロケータオブジェクトの作成
           ESIServerService serviceLocator = new ESIServerServiceLocator();
           //(6)プロキシオブジェクトの作成
           ESIServerPortType serviceProxy = serviceLocator.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); //(7)Webサービスの呼出し ESIMessage rspmsg = serviceProxy.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(); } catch (MalformedURLException e) { e.printStackTrace(); } } }
  1. 送信先WebサービスのURLの指定には、2通りの方法があります。

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

    • 手順1で取得したWSDLファイルに記述されている送信先WebサービスのURLとは異なるURLに送信する場合、送信先URLをパラメタに設定し、プロキシオブジェクトを作成します。
      例:ESIServerPortType serviceProxy = serviceLocator.getESIServerPort(new URL("送信先URL"));

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

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

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

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

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

      注意

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

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

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

    メソッド名

    キュー名

    シーケンス名

    sendESIMsgSync(ESIMessage)

    sendESIMsgAsync(ESIMessage)

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

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

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

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

    キー名

    情報

    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);

       
//(7)Webサービスの呼出し
ESIMessage rspmsg = serviceProxy.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";

       
//(7)Webサービスの呼び出し ESIMessage rspmsg = serviceProxy.receiveESIMsgAsync(fltr , queue); //戻り値ESIMessageのキュー名取得 String queueName = null; SIParameterItem[] resultItems = rspmsg.getHeader().getParameter().getItems(); if( resultItems[i].getKey().equals("com.fujitsu.esi.queue.name") ){ queueName = resultItems[i].getValue(); break; } }
  1. ESIJMSReceiveFilterにクエリを設定しない場合は、キューの先頭に格納されている共通メッセージを受信します。

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

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

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

          :
import org.apache.axis.client.Stub;

public class ESIClientSample {     

     public static void main(String[] args){
       try {
            //(1)ロケータオブジェクトの作成
            ESIServerService serviceLocator = new ESIServerServiceLocator();
            //(2)プロキシオブジェクトの作成
            ESIServerPortType serviceProxy = serviceLocator.getESIServerPort();

            //Basic認証:ユーザ名、パスワード設定
             ((Stub) serviceProxy)._setProperty(Stub.USERNAME_PROPERTY, "username");
             ((Stub) serviceProxy)._setProperty(Stub.PASSWORD_PROPERTY, "password");

            //接続タイムアウトの設定
             ((Stub) serviceProxy).setTimeout(50000); ……(a)

            //セション管理
             ((Stub) serviceProxy).setMaintainSession(true); ……(b)
          :
  1. AXISが提供しているStubクラスの以下のメソッドを使用し、接続を切断するタイムアウト時間(ミリ秒)を設定します。
    設定しない場合は、デフォルト値“60000(1分)”が有効となります。

    • public void setTimeout(int timeout)

    注意

    • AXISのバージョン1.3を利用した場合です。

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

  2. AXISが提供しているStubクラスの以下のメソッドを使用し、HTTPセション継続を行うかどうか設定します。
    設定しない場合は、デフォルト値“false”が有効となります。

    • public void setMaintainSession(boolean session)

    注意

    AXISのバージョン1.3を利用した場合です。

Proxy、SSLの設定

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

例:ESIClientSample.java

java
     -Dhttp.proxySet=true 
     -Dhttp.proxyHost=proxy.proxyhost.com
     -Dhttp.proxyPort=8080
     -Dhttp.nonProxyHosts =localhost|*.myhost.com
     -Dhttp.proxyUser=proxyUserName
     -Dhttp.proxyPassword=proxyPassword
     -Djavax.net.ssl.trustStore=C:\cert\truststore\keystore
     -Djavax.net.ssl.trustStorePassword=trustpass
     -Djavax.net.ssl.trustStoreType=jks
     -Djavax.net.ssl.keyStore=C:\cert\keystore\keystore
     -Djavax.net.ssl.keyStorePassword=keystorepass
     -Djavax.net.ssl.keyStoreType=jks
     ESIClientSample
表D.8 プロパティ値

プロパティ名

備考

http.proxySet

以下のどちらかを指定します。

  • true
    プロキシを介する

  • false
    プロキシを介さない

  

http.proxyHost

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

  

http.proxyPort

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

  

http.nonProxyHosts

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

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

http.proxyUser

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

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

http.proxyPassword

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

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

javax.net.ssl.trustStore

SSLサーバ認証用のキーストアのパス名
例)C:\cert\truststore\keystore

  

javax.net.ssl.trustStorePassword

SSLサーバ認証用のキーストアのパスワード
例)trustpass

  

javax.net.ssl.trustStoreType

SSLサーバ認証用のキーストアのタイプ
例)jks

  

javax.net.ssl.keyStore

SSLクライアント認証用のキーストアのパス名
例)C:\cert\keystore\keystore

  

javax.net.ssl.keyStorePassword

SSLクライアント認証用のキーストアのパスワード
例)keystorepass

  

javax.net.ssl.keyStoreType

SSLクライアント認証用のキーストアのタイプ
例)jks