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

2.2 CORBAを利用してISI呼び出しを行うアプリケーションの開発

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

図2.1 CORBAクライアントアプリケーション利用時のイメージ

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

例をもとに、CORBA利用時にスタブを利用するアプリケーションの開発手順を説明します。

アプリケーションの開発は、以下の手順で行います。

図2.2 開発の手順

前提

作成するソースファイル名:ESICorbaClient.c
作成するアプリケーション名:ESICorbaClient
CORBA用のインバウンドルーティング定義は設定済み。

インバウンドルーティング定義の作成方法および設定方法については、“ISI Studio ヘルプ”、“ISI 導入ガイド”を参照してください。

手順
  1. 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

    注意

    ISIが提供するIDL定義は変更しないでください。


  2. ORBを初期化します。

  3. ネーミングサービスへのオブジェクトリファレンスを取得します。

  4. インバウンドのCORBAアダプタのオブジェクトリファレンスを取得します。
    オブジェクト名は、“ESICORBARcv”です。

  5. 必要に応じて共通メッセージに格納するプロパティ情報を指定します。
    この時、ヘッダのキー名“com.fujitsu.esi.endpoint.inbound”にCORBAのサービスエンドポイント名を指定することも可能です。

  6. 共通メッセージに格納するペイロードを指定します。

  7. メッセージを送信します。

  8. 送信結果(ペイロード)を取得します。

  9. 送信結果(プロパティ)を取得します。
    取得できる代表的なプロパティには、以下の情報があります。

    表2.1 キー名と取得情報

    キー名

    情報

    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のどれかになります。


  10. 作成したソースをコンパイル・リンクします。
    ESICorbaClient.c、corbaservice_stub.cのソースをコンパイル・リンクします。
    コンパイル・リンク時の注意事項は、“Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)”を参照してください。

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

#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;
  
}