アプリケーション開発時は、スタブに対して必要な項目を設定します。スタブは、ISIが準備したIDL定義から生成します。
inタイプのパラメタには、共通メッセージのペイロードに格納するデータおよびプロパティ情報を指定します。
オペレーション呼出し後の処理結果は、outタイプのパラメタに設定されます。
図2.1 CORBAクライアントアプリケーション利用時のイメージ

ISIサーバでエラーが発生した場合でも、CORBAクライアントアプリケーションへ正常復帰します。
ISIサーバでのエラーをユーザ例外としてエラー情報(エラーコード、エラーメッセージ、およびプロパティ情報)を通知する動作に変更することも可能です。
詳細は、“ISI 導入ガイド”の“環境設定ファイルの設定”を参照してください。
例をもとに、CORBA利用時にスタブを利用するアプリケーションの開発手順を説明します。
アプリケーションの開発は、以下の手順で行います。
図2.2 開発の手順

作成するソースファイル名:ESICorbaClient.c
作成するアプリケーション名:ESICorbaClient
CORBA用のインバウンドルーティング定義は設定済み。
インバウンドルーティング定義の作成方法および設定方法については、“ISI Studio ヘルプ”、“ISI 導入ガイド”を参照してください。
IDLをコンパイルします。
ISIは、サービス利用側のアプリケーションに、以下のIDL定義を提供します。
![]()
IDLファイル:“<INSDIR>\etc\idl\corbaservice.idl”
![]()
IDLファイル:“/opt/FJSVesi/etc/idl/corbaservice.idl”
module esi {
    interface corbaservice {
        //
        // プロパティ情報
        //
        struct ESIProperty {
            string      name;
            string      value;
        };
        //
        // 型宣言
        //
        typedef sequence<ESIProperty> ESIProperties;
        typedef sequence<octet> ESIPayload;
        //
        // 例外
        //
        exception ESIError {
            string      errorCode;
            string      errorMessage;
            ESIProperties outProperties;
        };
        //
        // メッセージ送信
        //
        void sendMessage(
            in   ESIPayload  inObject,
            in   ESIProperties inProperties,
            out  ESIPayload  outObject,
            out  ESIProperties outProperties)
            raises(ESIError);
    };
}; | 
IDLファイルを作業ディレクトリにコピー後、IDLコンパイラを使用して、クライアントスタブを自動生成します。
IDLc -lc corbaservice.idl  | 
ORBを初期化します。
ネーミングサービスへのオブジェクトリファレンスを取得します。
インバウンドのCORBAアダプタのオブジェクトリファレンスを取得します。
オブジェクト名は、“ESICORBARcv”です。
必要に応じて共通メッセージに格納するプロパティ情報を指定します。
この時、ヘッダのキー名“com.fujitsu.esi.endpoint.inbound”にCORBAのサービスエンドポイント名を指定することも可能です。
共通メッセージに格納するペイロードを指定します。
メッセージを送信します。
送信結果(ペイロード)を取得します。
送信結果(プロパティ)を取得します。
取得できる代表的なプロパティには、以下の情報があります。
キー名  | 情報  | 
|---|---|
com.fujitsu.esi.status  | ISIの処理結果です。 
  | 
com.fujitsu.esi.error.code  | ISIの処理中に最初に発生したエラーのエラーコードです。  | 
com.fujitsu.esi.error.stepname  | エラーが発生したステップです。  | 
com.fujitsu.esi.error.methodtype  | エラーが発生したメソッド種別です。  | 
com.fujitsu.esi.error.handle.status  | ISI処理のエラー発生時に呼び出したシーケンスの処理結果です。 
  | 
com.fujitsu.esi.error.handle.code  | エラー発生時に呼び出したシーケンスの中で、最初に発生したエラーのエラーコードです。  | 
com.fujitsu.esi.error.handle.stepname  | エラー発生時に呼び出したシーケンスの中で、エラーが発生したステップです。  | 
com.fujitsu.esi.error.handle.methodtype  | エラー発生時に呼び出したシーケンスの中で、エラーが発生したメソッド種別です。  | 
作成したソースをコンパイル・リンクします。
ESICorbaClient.c、corbaservice_stub.cのソースをコンパイル・リンクします。
コンパイル・リンク時の注意事項は、“Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)”を参照してください。
![]()
#include <stdio.h>
#include "orb.h"
#include "OM_imr.h"
#include "CosNamin.h"
#include "corbaservice.h"
#define CORBASV_OBJNAME "ESICORBARcv"              /* オブジェクトリファレンス名 */
#define PAYLOADDATA     "This is sample message."  /* 送信メッセージ             */
int main( int  argc, char**   argv )
{
  CORBA_ORB                Orb;
  CosNaming_NamingContext  CosNaming;
  CORBA_Object             ESICorbaRcvObj; /* CORBAアダプタのオブジェクトリファレンス */
  CORBA_Environment        Env;            /* CORBAエラー情報                           */
  CosNaming_Name           NSName;         /* NS用Name                                  */
  CosNaming_NameComponent  NSComp;         /* NS用Nameコンポーネント                    */
  /* 送信用データ */
  esi_corbaservice_ESIProperties  InESIProperties;
  esi_corbaservice_ESIProperty    InESIPropertyArray[10];
  esi_corbaservice_ESIPayload     InESIPayload;
  /* 受信用データ */
  esi_corbaservice_ESIProperties* pOutESIProperties;
  esi_corbaservice_ESIPayload*    pOutESIPayload;
  esi_corbaservice_ESIProperty*   pOutESIProperty;
  int               i;
  char              wBuff[4096];
  /*
   * ORBの初期化(2)
   */
  Orb = CORBA_ORB_init( &argc,
              argv,
              FJ_OM_ORBid,
              &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : CORBA_ORB_init()" );
    return -1;
  }
  /*
   * ネーミングサービスへのオブジェクトリファレンスを取得(3)
   */
  CosNaming = CORBA_ORB_resolve_initial_references(
                  Orb,
                  CORBA_ORB_ObjectId_NameService,
                  &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : CORBA_ORB_resolve_initial_references()" );
    return -1;
  }
  /*
   * インバウンドのCORBAアダプタへのオブジェクトリファレンスを取得(4)
   */
  NSName._length  = 1;
  NSName._maximum = 1;
  NSName._buffer  = &NSComp;
  NSComp.id   = CORBASV_OBJNAME;
  NSComp.kind = "";
  ESICorbaRcvObj = CosNaming_NamingContext_resolve( CosNaming,
                            &NSName,
                            &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : CosNaming_NamingContext_resolve()" );
    CORBA_Object_release( CosNaming , &Env );
    return -1;
  }
  /*
   * プロパティの指定(5)
   */
  InESIProperties._length  = 1;
  InESIProperties._maximum = 1;
  InESIProperties._buffer  = InESIPropertyArray;
  memset( &InESIPropertyArray, 0x00, sizeof( InESIPropertyArray ) );
  InESIPropertyArray[0].name  = "category";
  InESIPropertyArray[0].value = "A01";
  /*
   * ペイロードの指定(6)
   */
  InESIPayload._maximum = strlen( PAYLOADDATA );
  InESIPayload._length  = strlen( PAYLOADDATA );
  InESIPayload._buffer  = (unsigned char*)PAYLOADDATA;
  /*
   * メッセージの送信(7)
   */
  esi_corbaservice_sendMessage( ESICorbaRcvObj,
                  &InESIPayload,
                  &InESIProperties,
                  &pOutESIPayload,
                  &pOutESIProperties,
                  &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : esi_corbaservice_sendMessage()" );
    CORBA_Object_release( CosNaming , &Env );
    CORBA_Object_release( ESICorbaRcvObj , &Env );
    CORBA_exception_free( &Env );
    return -1;
  }
  /*
   * 送信結果(ペイロード)の取得(8)
   */
  memset( wBuff, 0x00, sizeof( wBuff ) );
  memcpy( wBuff, pOutESIPayload->_buffer, pOutESIPayload->_length );
  printf( "payload : [%s]\n", wBuff );
  /* 
   * 送信結果(プロパティ)の取得(9)
   */
  printf( "property : \n" );
  for( i = 0; i < pOutESIProperties->_length; i ++ ) {
    pOutESIProperty = pOutESIProperties->_buffer;
    pOutESIProperty += i;
    printf( "  %s : [%s]\n",
    pOutESIProperty->name, pOutESIProperty->value );
  }
  CORBA_free(pOutESIProperties);
  CORBA_free(pOutESIPayload);
  CORBA_Object_release( ESICorbaRcvObj , &Env );
  CORBA_Object_release( CosNaming , &Env );
  CORBA_exception_free( &Env );
  return 0;
  
} | 
![]()
#include <stdio.h>
#include "orb.h"
#include "OM_impl_rep.h"
#include "CosNaming.h"
#include "corbaservice.h"
#define CORBASV_OBJNAME "ESICORBARcv"              /* オブジェクトリファレンス名 */
#define PAYLOADDATA     "This is sample message."  /* 送信メッセージ             */
int main( int  argc, char**   argv )
{
  CORBA_ORB                Orb;
  CosNaming_NamingContext  CosNaming;
  CORBA_Object             ESICorbaRcvObj; /* CORBAアダプタのオブジェクトリファレンス */
  CORBA_Environment        Env;            /* CORBAエラー情報                           */
  CosNaming_Name           NSName;         /* NS用Name                                  */
  CosNaming_NameComponent  NSComp;         /* NS用Nameコンポーネント                    */
  /* 送信用データ */
  esi_corbaservice_ESIProperties  InESIProperties;
  esi_corbaservice_ESIProperty    InESIPropertyArray[10];
  esi_corbaservice_ESIPayload     InESIPayload;
  /* 受信用データ */
  esi_corbaservice_ESIProperties* pOutESIProperties;
  esi_corbaservice_ESIPayload*    pOutESIPayload;
  esi_corbaservice_ESIProperty*   pOutESIProperty;
  int               i;
  char              wBuff[4096];
  /*
   * ORBの初期化(2)
   */
  Orb = CORBA_ORB_init( &argc,
              argv,
              FJ_OM_ORBid,
              &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : CORBA_ORB_init()" );
    return -1;
  }
  /*
   * ネーミングサービスへのオブジェクトリファレンスを取得(3)
   */
  CosNaming = CORBA_ORB_resolve_initial_references(
                  Orb,
                  CORBA_ORB_ObjectId_NameService,
                  &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : CORBA_ORB_resolve_initial_references()" );
    return -1;
  }
  /*
   * インバウンドのCORBAアダプタのオブジェクトリファレンスを取得(4)
   */
  NSName._length  = 1;
  NSName._maximum = 1;
  NSName._buffer  = &NSComp;
  NSComp.id   = CORBASV_OBJNAME;
  NSComp.kind = "";
  ESICorbaRcvObj = CosNaming_NamingContext_resolve( CosNaming,
                            &NSName,
                            &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : CosNaming_NamingContext_resolve()" );
    CORBA_Object_release( CosNaming , &Env );
    return -1;
  }
  /*
   * プロパティの指定(5)
   */
  InESIProperties._length  = 1;
  InESIProperties._maximum = 1;
  InESIProperties._buffer  = InESIPropertyArray;
  memset( &InESIPropertyArray, 0x00, sizeof( InESIPropertyArray ) );
  InESIPropertyArray[0].name  = "category";
  InESIPropertyArray[0].value = "A01";
  /*
   * ペイロードの指定(6)
   */
  InESIPayload._maximum = strlen( PAYLOADDATA );
  InESIPayload._length  = strlen( PAYLOADDATA );
  InESIPayload._buffer  = (unsigned char*)PAYLOADDATA;
  /*
   * メッセージの送信(7)
   */
  esi_corbaservice_sendMessage( ESICorbaRcvObj,
                  &InESIPayload,
                  &InESIProperties,
                  &pOutESIPayload,
                  &pOutESIProperties,
                  &Env );
  if( Env._major != CORBA_NO_EXCEPTION ) {
    printf( "ERROR : esi_corbaservice_sendMessage()" );
    CORBA_Object_release( CosNaming , &Env );
    CORBA_Object_release( ESICorbaRcvObj , &Env );
    CORBA_exception_free( &Env );
    return -1;
  }
  /*
   * 送信結果(ペイロード)の取得(8)
   */
  memset( wBuff, 0x00, sizeof( wBuff ) );
  memcpy( wBuff, pOutESIPayload->_buffer, pOutESIPayload->_length );
  printf( "payload : [%s]\n", wBuff );
  /* 
   * 送信結果(プロパティ)の取得(9)
   */
  printf( "property : \n" );
  for( i = 0; i < pOutESIProperties->_length; i ++ ) {
    pOutESIProperty = pOutESIProperties->_buffer;
    pOutESIProperty += i;
    printf( "  %s : [%s]\n",
    pOutESIProperty->name, pOutESIProperty->value );
  }
  CORBA_free(pOutESIProperties);
  CORBA_free(pOutESIPayload);
  CORBA_Object_release( ESICorbaRcvObj , &Env );
  CORBA_Object_release( CosNaming , &Env );
  CORBA_exception_free( &Env );
  return 0;
  
} |