アプリケーション開発時は、スタブに対して必要な項目を設定します。スタブは、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;
} |