静的起動インタフェースでサーバアプリケーションを呼び出す場合の例について説明します。
■初期化
初期化処理として、ORBのオブジェクトリファレンスを取得します。オブジェクトリファレンスを取得するには、初期化メソッドを呼び出します。
記述例を以下に示します。
main(argc, argv ) int argc; char *argv[]; { CORBA::ORB_ptr orb; // ORBのオブジェクトリファレンス CORBA::Environment_ptr env; // 例外情報 int current_argc = argc; env = new CORBA::Environment; // 例外情報 orb = CORBA::ORB_init(current_argc, argv, FJ_OM_ORBid, *env);
■ネーミングサービスのオブジェクトリファレンスの獲得
実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスを取得します。ネーミングサービスのオブジェクトリファレンスには、CORBAインタフェースのオブジェクトリファレンスの取り出しメソッドを使用します。
処理の記述例を以下に示します。
// NamingServiceのオブジェクトリファレンスを獲得 CORBA::Object_ptr obj = orb->resolve_initial_references( CORBA_ORB_ObjectId_NameService, *env ); // NamingContextクラスへの変換 CosNaming::NamingContext_ptr NamingContext_obj = CosNaming::NamingContext::_narrow( obj );
■サーバアプリケーションのオブジェクトリファレンスの獲得
ネーミングサービスから、実行したいサーバアプリケーションの情報を検索します。サーバアプリケーションの情報を取り出すには、実行するサーバアプリケーションのオブジェクト名をパラメタとしてメソッドを起動し、オブジェクトリファレンス情報が格納されているネーミングコンテキストを取得します。
処理の記述例を以下に示します。
CosNaming::Name_ptr name; // CosNaming::Nameのインスタンス CosNaming::NameComponent_var *name_component; // オブジェクト名格納域 CORBA::Object_ptr obj; // サーバアプリケーションのオブジェクトリファレンス // CosNaming::NameComponent_var領域の獲得 name_component = CosNaming::Name::allocbuf(1); // オブジェクト名 name_component[0]->id = (const CORBA::Char *)"ODdemo::calculator"; // オブジェクトのタイプ name_component[0]->kind = (const CORBA::Char *)""; // CosNaming::Name領域の獲得 name = CosNaming::Name(1,1,name_component,CORBA_TRUE ); // サーバアプリケーションのオブジェクトリファレンスを獲得 obj = NamingContext_obj-> resolve( *name, *env ); // ODdemo::calculatorクラスへの変換 ODdemo::calculator_ptr ap = ODdemo::calculator::_narrow( obj);
トランザクションを開始するために、Currentインタフェースのオブジェクトリファレンスを取得し、CosTransactions::Current::beginメソッドを呼び出します。
処理の記述例を以下に示します。
CosTransactions::Current_ptr Current; /* トランザクション開始オブジェクトリファレンス */ /* トランザクション開始インタフェースのオブジェクトリファレンスを獲得 */ obj = orb->resolve_initial_refarences( CORBA_ORB_ObjectId_TransactionCurrent, *env); Current = CosTransactions::Current::_narrow(obj); /* トランザクション開始メソッドの呼出し */ Current->begin(*env);
メソッド名は、IDLで指定したモジュール名、インタフェース名、およびオペレーション名をコロン2つ(::)でつなげた形式で指定します。この例では、ODdemo、calculator、およびcalculateが該当します。なお、メソッドを呼出し時に、ネーミングサービスから取得したサーバアプリケーションのオブジェクトリファレンスおよびサーバプログラムで例外が発生した場合、例外情報を獲得するためにCORBA::Environment構造体を指定します。
処理の記述例を以下に示します。
ODdemo::calculator::result res; // 復帰値 CORBA::Long a, b; // パラメタ a = 10; b = 5; // メソッドの呼出し res = ap->calculate( a, b, *env );
サーバアプリケーションのメソッド呼出しの結果を復帰状態から判断し、トランザクションの状態を決定します。トランザクションを正常終了する場合は、CosTransactions::Current::commitメソッドを呼び出し、トランザクションをコミットします。トランザクションを異常終了する場合は、CosTransactions::Current::rollbackメソッドを呼び出し、トランザクションをロールバックします。
処理の記述例を以下に示します。
/* サーバアプリケーションのメソッド呼出しの復帰状態を確認 */ if(env->exception()) Current->rollback(*env); else Current->commit(CORBA_TRUE, *env);