Interstage Application Server アプリケーション作成ガイド (データベース連携サービス編)
目次 索引 前ページ次ページ

第3章 クライアントアプリケーションの作成> 3.4 クライアントアプリケーションソースの作成(CurrentインタフェースのJava言語)> 3.4.2 ソースの作成

3.4.2.4 動的起動インタフェース

 動的起動インタフェースでサーバアプリケーションを呼び出す場合の、クライアントアプリケーションの記述例について説明します。

初期化

 初期化処理として、ORBのオブジェクトリファレンスを取得します。オブジェクトリファレンスを取得するには、初期化メソッドを呼び出します。記述例を以下に示します。

static org.omg.CORBA.ORB Orb;    //ORB用オブジェクトリファレンス
public void initialize(){
    try {
        //ORBの初期化処理
        Orb = org.omg.CORBA.ORB.init( arg, null ); 
          ... 
    }
    catch( java.lang.Exception e ){ 
          ... 
    }
} //initialize()

ネーミングサービスのオブジェクトリファレンスの獲得

 実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスを取得します。ネーミングサービスのオブジェクトリファレンスには、CORBAインタフェースのオブジェクトリファレンスの取り出しメソッドを使用します。処理の記述例を以下に示します。

org.omg.CosNaming.NamingContextExt Cos; //NamingService用オブジェクトリファレンス
try {
    //NamingServiceのオブジェクトリファレンスの取得
    org.omg.CORBA.Object _tmpObj = 
              Orb.resolve_initial_references( "NameService" ); 
    Cos = org.omg.CosNaming.NamingContextExtHelper.narrow( _tmpObj ); 
    if( Cos == null ){ 
          ...; 
    }
}
catch( java.lang.Exception e ){ 
      ...//例外処理
}

インタフェースリポジトリのサーバアプリケーション情報の獲得

 インタフェースリポジトリには、IDLで定義されたモジュール名、インタフェース名、オペレーション名、パラメタが階層構造で格納されています。インタフェースリポジトリからサーバアプリケーションの情報を獲得する方法について、以下に示します。

(1) InterfaceDefオブジェクトリファレンスの獲得

 インタフェースリポジトリからサーバアプリケーションの情報を取得するためには、InterfaceDefオブジェクトのオブジェクトリファレンスが必要です。InterfaceDefオブジェクトのオブジェクトリファレンスを求めるには、オブジェクト名をパラメタとして、ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを求め、その後、CORBA_Object_get_interface()メソッドにより、InterfaceDefオブジェクトリファレンスを取得します。処理の記述例を以下に示します。

try {
    String NCid = new String( "ODdemo::calculator" );  //オブジェクト名
    String NCkind = new String( "" );                  //オブジェクトのタイプ

    //オブジェクト名、タイプの設定
    org.omg.CosNaming.NameComponent nc = 
                     new org.omg.CosNaming.NameComponent( NCid, NCkind ); 
    org.omg.CosNaming.NameComponent NCo[] = { nc };

    //NamingServiceのresolveメソッドを発行
    org.omg.CORBA.Object target = Cos.resolve( NCo ); 

    //org.omg.CORBA.InterfaceDefオブジェクトリファレンス取得
    org.omg.CORBA.InterfaceDef intf = target._get_interface();
}
catch( java.lang.Exception e ) {
      ...//例外処理
}

(2) OperationDefオブジェクトリファレンスの取得

 サーバアプリケーションのメソッド名をパラメタとして、CORBA_InterfaceDef_lookup_name()メソッドにより、指定されたメソッドをインタフェースリポジトリから検索します。このメソッドにより、指定したメソッド情報が格納されているOperationDefオブジェクトのオブジェクトリファレンスが通知されます。
 処理の記述例を以下に示します。

//メソッドのorg.omg.CORBA.OperationDefオブジェクトリファレンス取得
String name = new String( "calcurate" ); 
org.omg.CORBA.Contained[] intf_opr =
intf.lookup_name( name, -1, org.omg.CORBA.DefinitionKind.dk_Operation, false );

(3) パラメタ情報の取得

 org.omg.CORBA.Contained.describe()メソッドにより、サーバアプリケーションがもっているメソッドのパラメタの情報(パラメタの名前、個数、パラメタの型等)をインタフェースリポジトリから検索します。パラメタとして、org.omg.CORBA.OperationDefオブジェクトリファレンスを指定します。

org.omg.CORBA.ContainedPackage.Description desc = intf_opr[0].describe();
//指定されたメソッドのパラメタ情報を検索

トランザクションの開

 トランザクションを開始するために、Currentインタフェースのオブジェクトリファレンスを取得し、CosTransactions.Current.beginメソッドを呼び出します。処理の記述例を以下に示します。

static org.omg.CosTransactions.Current current; 
                                 // トランザクション開始オブジェクトリファレンス
  
//トランザクション開始インタフェースのオブジェクトリファレンスを獲得  
org.omg.CORBA.Object  _tmpObj1 =
                   Orb.resolve_initial_references("TransactionCurrent");
current  = org.omg.CosTransactions.CurrentHelper.narrow(_tmpObj1);

//トランザクション開始メソッドの呼び出し
current.begin();            

パラメタの組み立

(1) パラメタリストの生成

 org.omg.CORBA.ORB.create_list()メソッドにより、サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、何個のパラメタを格納するかを指定します。結果として、NVListオブジェクトリファレンスが通知されます。処理の記述例を以下に示します。

org.omg.CORBA.NVList Nvl;  //NVList

//org.omg.CORBA.ContainedPackage.Description構造体からパラメタ情報構造体の抽出
org.omg.CORBA.Any opeany = desc.value; 
org.omg.CORBA.OperationDescription c
                    = org.omg.OperationDescriptionHelper.extract( opeany ); 
org.omg.CORBA.ParameterDescription[] paraseq = c.parameters; 

//パラメタ情報の抽出
int ParamCount = paraseq.length; 

//リストオブジェクトの生成
Nvl = Orb.create_list( ParamCount );

(2) パラメタリストの設定

 org.omg.CORBA.NVList.add_value()メソッドにより、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタとして、サーバアプリケーションのパラメタの名前、値(Any型)およびパラメタの形式を設定します。処理の記述例を以下に示します。

org.omg.CORBA.NamedValue tmpNam; 
org.omg.CORBA.Any  Anya = Orb.create_any();
Anya.insert_long(a); 
tmpNam = Nvl.add_value( paraseq[0].name, Anya, org.omg.CORBA.ARG_IN.value ); 
org.omg.CORBA.Any  Anyb = Orb.create_any();
Anyb.insert_long(b); 
tmpNam = 
    Nvl.value.add_value( paraseq[1].name, Anyb, org.omg.CORBA.ARG_IN.value );

リクエストの作

 org.omg.CORBA.Object._create_request()メソッドにより、リクエストオブジェクトを作成します。リクエストオブジェクトに対して、サーバオブジェクトのオブジェクトリファレンス、org.omg.CORBA.NVListオブジェクトリファレンス、org.omg.CORBA.NamedValueと呼ぶサーバの処理結果を格納する領域を指定します。結果として、リクエストオブジェクトが返されます。処理の記述例を以下に示します。

//復帰パラメタ
org.omg.CORBA.Any AnyResult = Orb.create_any();
AnyResult.type(c.result); 

//復帰パラメタ格納域
org.omg.CORBA.NamedValue Result =
         Orb.create_named_value( null, AnyResult, org.omg.CORBA.ARG_OUT.value); 
String OpName = new String(c.name); 

//リクエストオブジェクトの生成
org.omg.CORBA.Request Req = target._create_request(
      null,      //context
      OpName,   //メソッド名
      Nvl,      //入力パラメタ
      Result);  //復帰値

リクエストの送

 サーバアプリケーションに対してリクエストを送信します。リクエストの方法として、以下に示す方法があります。

 それぞれについて、以下に示します。

同期送

 org.omg.CORBA.Request.invoke()メソッドにより、サーバアプリケーションを呼び出します。
 処理の記述例を以下に示します。

Req.invoke();

非同期送

 org.omg.CORBA.Request.send_deferred()メソッドにより、サーバアプリケーションを呼び出します。サーバアプリケーションの処理結果は、org.omg.CORBA.Request.get_response()メソッドにより受け取ります。処理の記述例を以下に示します。

Req.send_deferred();   //処理の要求
Req.get_response();    //処理結果の受け取り

 org.omg.CORBA.Request.get_response()サーバアプリケーションからリクエストが完了していないことが判明した場合、再度org.omg.CORBA.Request.get_response()メソッドを呼び出します。

リクエストの削

 リクエストオブジェクトのオブジェクトリファレンスをパラメタとして、CORBA.Request.delete()メソッドにより、リクエストオブジェクトを削除します。処理の記述例を以下に示します。

CORBA.Request.delete(); //リクエストオブジェクトの削除 

トランザクションの完

 サーバアプリケーションのメソッド呼び出しの結果を復帰状態から判断し、トランザクションの状態を決定します。トランザクションを正常に終了させる場合には、CosTransactions.Current.commitメソッドを呼び出し、トランザクションをコミットさせます。トランザクションを異常で終了させる場合には、CosTransactions.Current.rollbackメソッドを呼び出し、トランザクションをロールバックさせます。処理の記述例を以下に示します。

boolean                rhuristic;
   ...
rhuristic = true;
try {
    current.commit( rhuristic );
} catch( NoTransaction e) {
    ...//例外処理
}
    ...
current.rollback( );

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

Copyright 2008 FUJITSU LIMITED