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

11.1.1 サーバアプリケーションのプログラミング

Factoryインタフェースによるオブジェクトリファレンスの作成方法について説明します。


(1) サーバの初期化/活性化

インタフェース情報およびインプリメンテーション情報を獲得し、オブジェクトリファレンスを作成します。

  1. 初期化
    CORBA::ORB_init()、CORBA::ORB::BOA_init()によりサーバの初期化を行います。

  2. インプリメンテーション情報の獲得
    Factoryインタフェースのインプリメンテーション情報を獲得します。FJ::ImplementationRep::lookup_id()でFactoryインタフェースのインプリメンテーションリポジトリID(“_IMPL_モジュール名_factory”)を指定します。

  3. インタフェース情報の獲得
    Factory以外のインタフェース情報を獲得します。

  4. サーバの活性化
    2.で獲得したインプリメンテーション情報を指定してCORBA::BOA::impl_is_ready()またはCORBA::BOA::obj_is_ready()を発行します。これにより、IDLに定義されたすべてのインタフェースが活性化されます。

    boa->impl_is_ready( impl, env );

ここでは、main関数でインプリメンテーション情報/インタフェース情報を獲得する例を示します。

static  CORBA::ORB_ptr                orb; 
static  CORBA::BOA_ptr                boa; 
static  CORBA::Repository_ptr         intf_rep; 
static  FJ::ImplementationRep_ptr     impl_rep; 
static  CORBA::InterfaceDef_ptr       intf1; 
static  CORBA::ImplementationDef_ptr  impl; 
static  CORBA::Object_ptr             o; 
static  CORBA::Environment            env; 
CORBA::ReferenceData                  id; 

int
main( int argc, char *argv[] ) 
{
      int        current_argc = argc; 
      char       buf[128]; 

      // 初期化処理
      orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env ); 
      boa = orb->BOA_init( current_argc, argv, CORBA_BOA_OAid, env ); 

      // インプリメンテーション情報の獲得
      o = orb->resolve_initial_references(
              CORBA_ORB_ObjectId_ImplementationRepository, env ); 
      impl_rep = FJ::ImplementationRep::_narrow( o ); 
      o = impl_rep->lookup_id( _IMPL_ODsample_factory, env ); 
      impl = CORBA::ImplementationDef::_narrow( o ); 

      // インタフェース情報の獲得
      o = orb->resolve_initial_references(
              CORBA_ORB_ObjectId_LightInterfaceRepository, env ); 
      intf_rep = CORBA::Repository::_narrow( o ); 
      o = intf_rep->lookup_id( _INTF_ODsample_intf1, env ); 
      intf1 = CORBA::InterfaceDef::_narrow( o ); 

      // サーバの活性化
      boa->impl_is_ready( impl, env ); 
}

(2) Factoryインタフェースの実装関数

前項で獲得したインプリメンテーション情報/インタフェース情報を使用して、CORBA::BOA::create()でオブジェクトリファレンスを作成します。

// create_obj メソッドの実装
ODsample::intf1_ptr 
ODsample_factory_impl::create_obj( CORBA::Environment &env ) 
      throw( CORBA::Exception ) 
{
      // BOA::create関数を使用して、オブジェクトリファレンスを作成します。
      CORBA::Object_ptr new_obj = boa->create( id, intf1,  impl, env ); 
      ODsample::intf1_ptr fac = ODsample::intf1::_narrow( new_obj ); 
      CORBA::release( new_obj ); 
      return( fac ); 
}

(3) ネーミングサービスへの登録

OD_or_admコマンドでネーミングサービスにFactoryインタフェースのオブジェクトリファレンスを登録します。-cオプションには、FactoryインタフェースのインタフェースリポジトリIDを指定します。

OD_or_adm -c IDL:ODsample/factory:1.0 -n ODsample::factory