アプリケーション開発時は、スタブに対して必要な項目を設定します。スタブは、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を初期化します。
ネーミングサービスへのオブジェクトリファレンスを取得します。
ISIの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; } /* * ISIの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; } |