ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(データベース連携サービス編)
Interstage

3.8.1 ソースプログラムの作成(静的起動インタフェース)

静的起動インタフェースでサーバアプリケーションを呼び出す場合の例について説明します。


■初期化

初期化処理として、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);