ページの先頭行へ戻る
Interstage Application Server V13.0.0 アプリケーション作成ガイド(CORBAサービス編)
FUJITSU Software

G.1.2 C++言語の開発

G.1.2.1 Basic Object Adapter : BOA

動的スケルトンインタフェース(DSI)のサーバアプリケーションは、初期化処理部とサーバアプリケーションが実装するゲートウェイから構成されます。初期化処理部では、以下に示す処理を行います。



G.1.2.1.1 初期化

CORBAの初期化メソッドCORBA::ORB_init()を呼び出し、初期化処理を行います。結果として、ORBのオブジェクトリファレンスが返されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。
また、基本オブジェクトアダプタの初期化処理を行います。


G.1.2.1.2 ゲートウェイの登録

サーバアプリケーションが実装するゲートウェイをORBに対して通知します。このため、以下の手順で処理を行います。

  1. CORBA::ORB::resolve_initial_references()によりインプリメンテーションリポジトリのオブジェクトリファレンスを取り出します。メソッドのパラメタとしてCORBA_ORB_ObjectId_ImplementationRepositoryを指定します。

  2. サーバアプリケーションのImplementationRepオブジェクトのオブジェクトリファレンスを求めるため、FJ::ImplementationRep::lookup_id()を発行します。

  3. サーバアプリケーションが実装するゲートウェイを登録するために、CORBA::BOA::set_impl_dsi()を発行します。

    boa->set_impl_dsi(
        boa, 
        *env, 
        (CORBA_DynamicImplementationRoutine_cpp)dsi ); 

G.1.2.1.3 サーバの活性化

サーバアプリケーションの初期化が完了すると、ORBに対してその旨を通知します。ORBは、この命令が発行された時点で、クライアントからの要求をサーバアプリケーションに伝えます。


G.1.2.1.4 ゲートウェイの処理

ゲートウェイでは、以下に示す処理を行います。

ゲートウェイの実装例を以下に示します。

static void
dsi(
    CORBA::Object_ptr          obj, 
    CORBA::ServerRequest_ptr   request, 
    CORBA::Environment         &ev ) 
{
    CORBA::RepositoryId dsi_op_name; 

    try {
        // (1) メソッドの解析
        dsi_op_name = request->op_name( ev ); 
        if( strcmp( dsi_op_name, "calculate" ) == 0 ) {
            method_calculate( request ); 
        }
        CORBA::string_free( dsi_op_name ); 
    }
    // (5) 例外情報の設定
    catch ( ODdemo::calculator::ZEROPARAM &_zeroparam ) {
        CORBA::Any *_any = new CORBA::Any( _tc_ODdemo_calculator_ZEROPARAM, &_zeroparam );
        request->exception( _any, ev );
    }
    catch ( CORBA::Exception e ){
        // 例外発生時の処理を記述してください。
        // 復帰情報あるいは例外情報を設定してください
    }
    return; 
}

void
method_calculate( CORBA::ServerRequest_ptr request )
throw( CORBA::Exception ) 
{
    try {
        // (2) パラメタの組立て
        // パラメタリストの生成
        CORBA::NVList_ptr    arg_list;
        orb->create_list( 2, arg_list, *env ); 

        CORBA::Any p1, p2;

        CORBA::Long l;

        // パラメタ情報の登録
        l = 0;
        p1 <<= l;
        arg_list->add_value(
                            "a",
                            p1,
                            CORBA::ARG_IN,
                            *env );
        p2 <<= l;
        arg_list->add_value(
                            "b",
                            p2,
                            CORBA::ARG_IN,
                            *env );

        // (3) パラメタの解析
        request->params(
                       arg_list,
                       *env );

        CORBA::NamedValue_ptr	nvp1, nvp2;

        nvp1 = arg_list->item(0,*env);
        nvp2 = arg_list->item(1,*env);

        CORBA::Any *r1, *r2;
        r1 = nvp1->value(*env);
        r2 = nvp2->value(*env);

        CORBA::Long a,b; 
         (*r1) >>= a;
         (*r2) >>= b;
        cout << " a = [" << a << "] b = [" << b << "]" << endl;

        if ( b == 0 ){
            ODdemo::calculator::ZEROPARAM excep = ODdemo::calculator::ZEROPARAM();
            throw( excep );
        }

        // (4) 復帰情報の設定
        ODdemo::calculator::result *res =
            new ODdemo::calculator::result();
        res->add_result = a+b;
        res->subtract_result = a-b;
        res->multiple_result = a*b;
        res->divide_result = (CORBA::Float)a/b;

        CORBA::Any *tmp_any = new CORBA::Any;
        tmp_any->replace( _tc_ODdemo_calculator_result, (void *)res, CORBA_TRUE );
        request->result( tmp_any, *env );
    }
    catch ( ODdemo::calculator::ZEROPARAM &_zeroparam ) {
        throw( _zeroparam );
    }
    catch( CORBA::Exception e ) {
        throw( e );
    }
}

(1)メソッドの解析

CORBA::ServerRequest::op_name()を発行して、メソッド名を解析します。


(2)パラメタの組立て

パラメタリストの生成

CORBA::ORB::create_list()メソッドにより、アプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクトを生成します。このとき、引数として何個のパラメタを格納するかを指定します。結果として、CORBA::NVListオブジェクトが返されます。


パラメタ情報の登録

CORBA::NVList::add_item()により、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタとして、CORBA::NVListオブジェクトリファレンス、サーバアプリケーションのパラメタの名前、型、値、および長さを設定します。


(3)パラメタの解析

CORBA::ServerRequest::params()を発行して、パラメタを解析します。この結果、アプリケーションに渡すパラメタ値が取得されます。


(4)復帰情報の設定

CORBA::ServerRequest::result()を発行して、復帰情報を設定します。


(5)例外情報の設定

CORBA::ServerRequest::exception()を発行して、例外情報を設定します。


G.1.2.1.5 サーバの非活性化

サーバアプリケーションは、利用者等からの停止要求を受けた場合、クライアントからの要求を以降受け付けない旨をORBに対して通知します。ORBはこの通知を受けて、クライアントからの処理要求をサーバアプリケーションに伝えず、クライアントに例外を返します。


G.1.2.2 パラメタの獲得/解放

動的スケルトンインタフェースを使用して動的にパラメタを作成する方法について説明します。
パラメタはCORBA::NVList::add_value()を使用して設定します。


inパラメタ

クライアントアプリケーションからinパラメタを受け取る場合、パラメタ領域の獲得/解放を行う必要はありません。add_value()は、以下のように指定します。

CORBA::Any        p1( ((*params)[0])->type, &i, CORBA_TRUE ); 
arg_list->add_value(
      name,                        /* IDLで指定したパラメタの名前を設定します */
      p1,                          /* inで使用する値を設定したAny型を設定します */
      CORBA::ARG_IN,               /* CORBA::ARG_INを設定します */
      *env );

outパラメタ

サーバアプリケーションの処理結果をoutパラメタで渡す場合、データ域獲得関数(CORBA::long_alloc()など)で領域を獲得し、そのポインタをadd_value()の第2パラメタに指定します。

CORBA::Any        *p2 = new CORBA::Any( ((*params)[1])->type, &i, CORBA_TRUE ); 
arg_list->add_value(
      name,                        /* IDLで指定したパラメタの名前を設定します */
      *p2,                         /* outの値を設定するAny型を設定します */
      CORBA::ARG_OUT,              /* CORBA::ARG_OUTを設定します */
      *env );

獲得した領域は、CORBAサービス内でリクエスト復帰後に解放されます。


inoutパラメタ

クライアントアプリケーションからinoutパラメタを受け取る場合、パラメタ領域の獲得/解放を行う必要はありません。add_value()は、以下のように指定します。

CORBA::Any        *p3 = new CORBA::Any(( (*params)[2])->type, &i, CORBA_TRUE ); 
arg_list->add_value(
      name,                        /* IDLで指定したパラメタの名前を設定します */
      *p3,                         /* inoutの値を設定するAny型を設定します */
      CORBA::ARG_INOUT,            /* CORBA::ARG_INOUTを設定します */
      *env );

サーバアプリケーションの処理結果をinoutでクライアントアプリケーションに渡す場合、以下のようにします。

固定長データの場合

CORBA::ServerRequest::params()で通知されたパラメタ領域に値を設定します。

可変長データの場合

CORBA::ServerRequest::params()で通知されたパラメタ領域を、CORBA::free()でいったん解放した後、データ域獲得関数(CORBA::string_alloc()など)で領域を獲得し、そのポインタを再設定します。新しいデータをその領域に設定します。

inoutパラメタとして使用した領域は、リクエスト復帰後にスケルトンで解放されます。


復帰パラメタ

サーバアプリケーションの処理結果を復帰パラメタ渡す場合、データ域獲得関数(CORBA::long_alloc()など)で領域を獲得します。