Interstage Application Server SOAPサービス ユーザーズガイド
目次 索引 前ページ次ページ

第5章 RPC方式のアプリケーションの実装> 5.5 DII方式によるRPCクライアントアプリケーション

5.5.1 基本的なRPCクライアントアプリケーション(DII方式)

 以下、サンプルプログラムSampleRpcCL2.javaの例を用いて処理を説明します。

 import javax.xml.rpc.Call;
 import javax.xml.rpc.ParameterMode;
 import javax.xml.rpc.Service;
 import javax.xml.rpc.ServiceFactory;
 import javax.xml.rpc.NamespaceConstants;
 import javax.xml.soap.SOAPElement;
 import javax.xml.soap.Detail;
 import javax.xml.namespace.QName;
 import javax.xml.transform.Source;
 import java.util.Map;
 import java.util.Iterator;
 import com.fujitsu.interstage.soapx.Constants;
 import com.fujitsu.interstage.soapx.types.UnsignedInt;

 public class SampleRpcCL2
 {
   public static void main( String[] args )//**(1)**
   {
     try {
     //**(2)**
       String endpointURL = "http://localhost/soap/servlet/WSContainer";
//** SSLの場合 **
//**   String endpointURL = "https://localhost/soap/servlet/WSContainer";
       QName operationName = new QName( "urn:IntSample", "opInt" );
       QName dataType = new QName( 
                     NamespaceConstants.NSPREFIX_SCHEMA_XSD, "int" );
       QName unsignedDataType = new QName( 
                     NamespaceConstants.NSPREFIX_SCHEMA_XSD, "unsignedInt" );

       //**(3)**
       Service service = ServiceFactory.newInstance()
                     .createService(new QName( "urn:IntSample", "IntSampleService" ));
       Call call = service.createCall();

       //**(4)**
       call.setTargetEndpointAddress(endpointURL);
       call.setOperationName(operationName);

       //**(5)**
       call.addParameter( "arg1", dataType, ParameterMode.IN );
       call.addParameter( "arg2", unsignedDataType, ParameterMode.IN );
       call.addParameter( "arg3", dataType, ParameterMode.OUT );
       call.addParameter( "arg4", Constants.MIME_SOURCE , ParameterMode.OUT );
       call.setReturnType(dataType);

       //**(6)**
       Integer arg1 = new Integer(100);
       UnsignedInt arg2 = new UnsignedInt(200l);
       Object[] param = new Object[] {arg1, arg2};

       System.out.println( "arg1 = " + arg1 );
       System.out.println( "arg2 = " + arg2.longValue() );

       //**(7)**
       Integer ret = (Integer)call.invoke( param );

       //**(8)**
       Map outParams = call.getOutputParams();
       Integer arg3 = (Integer)outParams.get("arg3");
       Source arg4 = (Source)outParams.get("arg4");

       System.out.println( "arg3 = " + arg3 );
       System.out.println( "ret  = " + ret );

     //**(9)**
     } catch( javax.xml.rpc.ServiceException e ) {
       e.printStackTrace();
       if( e.getLinkedCause() != null ) {
         e.getLinkedCause().printStackTrace();
       }
     } catch( javax.xml.rpc.soap.SOAPFaultException e ) {
       e.printStackTrace();
       System.out.println("  Code = " + e.getFaultCode());
       System.out.println("  String = " + e.getFaultString());
       System.out.println("  Actor = " + e.getFaultActor());
       if( e.getDetail() != null ) {
         Detail detail = e.getDetail();
         Iterator it = detail.getDetailEntries();
         if( it != null ){
           while(it.hasNext()){
             SOAPElement elm = (SOAPElement)it.next();
             System.out.println("  Detail = " + elm);
           }
         }
       }
     } catch( javax.xml.rpc.JAXRPCException e ) {
       e.printStackTrace();
       if( e.getLinkedCause() != null ) {
         e.getLinkedCause().printStackTrace();
       }
     } catch( java.rmi.RemoteException e ){
       e.printStackTrace();
       if( e.detail != null ) {
         e.detail.printStackTrace();
       }
     } catch( Throwable e ) {
       e.printStackTrace();
     }
   }
 }

 この例では、URL(http://localhost/soap/servlet/WSContainer) オペレーション名(opInt)、サービス名(IntSample)のリモート呼び出しを行います。

■任意のクラス、任意のメソッドで実装可能

 RPCクライアントアプリケーションでは、実装や継承が必要なクラスはありません。任意クラスの任意メソッドで送信処理を行うことができます。−(1)

■リモート呼び出し先の特定

 リモート呼び出しするRPCサーバアプリケーションを特定するために、以下の情報をWSDLから用意します。−(2)

 Webサービス識別名とURLの詳細については“Webサービス識別名とURL”を参照してください。

■リモート呼び出しオブジェクトCallの取得

 リモート呼び出しを表すCallオブジェクトを取得します。−(3)

 Callオブジェクトは、リモート呼び出しに関する情報を管理し、実際にリモート呼び出しを行う機能があります。

■リモート呼び出しオブジェクトCallへのサービス情報設定

 Callオブジェクトに“呼び出し先サービスの情報の用意”で用意した、接続先URLとオペレーションのネームスペース名とサービスのname属性を表すjavax.xml.namespace.QNameオブジェクトを設定します。−(4)

■リモート呼び出しオブジェクトCallへのオペレーションの情報設定

 リモート呼び出しするオペレーションのパラメタおよび返り値の型など、インタフェース情報をCallオブジェクトに指定します。−(5)

 オペレーションの返り値は、setReturnTypeメソッドを使用し、XMLのデータ型を指定します。

オペレーションのパラメタについて順番に、addParameterメソッドを使用し、パラメタ名、XMLのデータ型、in/inout/outの種別を指定します。
 パラメタおよび返り値に使用できるデータ型については、“サポートされるデータ型”を参照してください。

 inパラメタは呼び出し元で値を設定し、呼び出し先に値が送られるパラメタです。outパラメタは、呼び出し元では値を設定せず、呼び出し先で値が設定されて返されるパラメタです。inoutパラメタは呼び出し元で設定した値が呼び出し先に送られるとともに、呼び出し先でその値が更新されて呼び出しもとに返されるパラメタです。

 この例では、リモート呼び出しを行うオペレーションの第1パラメタは、パラメタ名"arg1"のXMLのint型のinパラメタ、第2パラメタは、パラメタ名"arg2"のXMLのunsignedInt型のinパラメタ、第3パラメタは、パラメタ名"arg3"のXMLのint型のoutパラメタ、第4パラメタは、パラメタ名"arg4"の添付ファイル(アタッチメント)を利用したXMLデータ(JAVA上はjavax.xml.transform.Source型)のoutパラメタとなっています。

ユーザ定義型を使用する場合は、“ユーザ定義型を使用するRPCクライアントアプリケーション(DII方式)”を参照してください。

■リモート呼び出しの送信パラメタ値配列の用意

 呼び出し先に送信する、オペレーションのinパラメタおよびinoutパラメタの値をObject型の配列として用意します。この配列にはoutパラメタは含みません。−(6)

■リモート呼び出しの実行

 Callオブジェクトのinvokeメソッドで、リモート呼び出しを実行します。invokeメソッドのパラメタとして、"リモート呼び出しの送信パラメタ値配列の用意"で用意した送信パラメタ値配列を渡します。−(7)

 呼び出し先のオペレーションに返り値がある場合は、invokeメソッドの返り値を、オペレーションの返り値の型にキャストして取得します。

■リモート呼び出しの受信パラメタの取得

 呼び出し先のオペレーションにinoutまたはoutパラメタがある場合は、invokeメソッドを呼び出したCallオブジェクトから、getOutputParamsメソッドを使用して返信された値を取り出します。

 inout/outパラメタの値は、java.util.Mapオブジェクトにまとめられて返されます。パラメタ名をキーにしてそれぞれのパラメタの値を取り出します。−(8)

■例外の処理

 RPC呼び出しを行うクライアントアプリケーションは以下の例外をcatchする必要があります。−(9)


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005