Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(C++言語)> 5.3 サーバアプリケーションのプログラミング(Portable Object Adapter:POA)> 5.3.7 サーバアプリケーションのプログラミング例

5.3.7.7 代理方式の実装例(デフォルトインスタンス方式の例)

(1)IDL定義

  module ODsample{
      interface  intf{
          long  add( in  long  a,  in  long  b ); 
      }; 
  };

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

 動的登録

(3)アプリケーション構成概要図

(4)クライアントアプリケーション

  #include <stdlib.h>
  #include <iostream.h>
  #include "orb_cplus.h"
  #include "CosNaming_cplus.h"
  #include "simple.h"

  static  CORBA::Object_var             obj; 
  static  CORBA::ORB_var                orb; 
  static  CORBA::Environment            env; 
  static  CosNaming::NamingContext_var  cos_naming; 
  static  CosNaming::Name               name; 

  int main( int argc, char* argv[] ) 
  {
      try {
          // ORBの生成と初期化
          orb = CORBA::ORB_init( argc, argv, FJ_OM_ORBid, env ); 

          // ネーミングサービスのオブジェクトリファレンスの取得
          obj = orb->resolve_initial_references(
                        CORBA_ORB_ObjectId_NameService, env ); 
          cos_naming = CosNaming::NamingContext::_narrow( obj ); 

          // ネーミングサービスのresolveメソッドを発行し、
          // サーバアプリケーションのオブジェクトリファレンスの獲得
          name.length( 1 ); 
          name[0]->id   = ( const CORBA::Char* )"ODsample::POAsample1"; 
          name[0]->kind = ( const CORBA::Char* )""; 
          obj = cos_naming->resolve( name, env ); 

          // サーバアプリケーションのオブジェクトリファレンス獲得
          ODsample::intf* obj2 = ODsample::intf::_narrow( obj ); 

          CORBA::Long  a;     // inパラメタ用変数
          CORBA::Long  b;     // inパラメタ用変数
          CORBA::Long  ret;   // 復帰値用変数

          printf( "  a => " ); 
          scanf( "%d", &a ); 
          printf( "  b => " ); 
          scanf( "%d", &b ); 

          // サーバアプリケーションのメソッド呼出し
          ret = obj2->add( a, b, env ); 

          // メソッドの結果表示
          printf( "  a + b = %d", ret ); 

          CORBA::release( obj2 ); 
      }catch( CORBA::SystemException&  se ) {
          cout << "exception-id: " << se.id() << endl; 
          exit(1); 
      }catch( CORBA::Exception& e ) {
          cout << "exception-id: " << e.id() << endl; 
          exit(1); 
      }
      return 0; 
  }

(5)サーバアプリケーション

  #include <iostream.h>
  #include <stdlib.h>
  #include "orb_cplus.h"
  #include "poa.h"
  #include "CosNaming_cplus.h"
  #include "simple.h"

  static CORBA::ORB_var                   orb; 
  static CORBA::Object_var                obj; 
  static CORBA::Environment               env; 
  static CosNaming::NamingContext_var     cos_naming; 
  static CosNaming::Name                  name; 
  static PortableServer::POA_var          rootPOA; 
  static PortableServer::POA_var          childPOA; 
  static CORBA::PolicyList                policies( 4 ); 
  static PortableServer::POAManager_var   poa_manager; 

  // ユーザアプリケーション:メイン処理クラス
  int main( int argc, char*argv[] ) 
  {
      int current_argc = argc; 

      try{
          // ORBの生成と初期化
          orb         = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env ); 

          // RootPOAのオブジェクトリファレンスの取得
          obj         = orb->resolve_initial_references( "RootPOA", env ); 

          // RootPOAのPOAオブジェクト獲得
          rootPOA     = PortableServer::POA::_narrow( obj ); 

          // インタフェース用のPOA作成
          // ポリシリスト作成
          policies.length( 4 ); 
          policies[0] = rootPOA->create_servant_retention_policy(
                                 PortableServer::NON_RETAIN, env ); 
          policies[1] = rootPOA->create_request_processing_policy(
                                 PortableServer::USE_DEFAULT_SERVANT, env ); 
          policies[2] = rootPOA->create_id_assignment_policy(
                                 PortableServer::SYSTEM_ID, env ); 
          policies[3] = rootPOA->create_id_uniqueness_policy(
                                 PortableServer::MULTIPLE_ID, env ); 

          // Default Servant用のPOAオブジェクトの作成
          childPOA   = rootPOA->create_POA( "childPOA", 
                          PortableServer::POAManager::_nil(), policies, env ); 

          // tieオブジェクト作成とユーザクラスの登録
          PortableServer::Servant svt = _ct_ODsample_intf(); 

          // POAのDefault Servantに設定
          childPOA->set_servant( svt, env ); 

          CORBA::Object_var _bind_obj = childPOA->create_reference( "IDL:ODsample/intf:1.0", env ); 

          // ネーミングサービスのオブジェクトリファレンスの取得
          CORBA::Object_var _tmpObj = orb->resolve_initial_references( "NameService", env ); 
          cos_naming = CosNaming::NamingContext::_narrow( _tmpObj ); 

          // サーバアプリケーションのオブジェクトリファレンスの獲得
          name.length( 1 ); 
          name[0]->id   = ( const CORBA::Char* )"ODsample::POAsample1"; 
          name[0]->kind = ( const CORBA::Char* )""; 
          try{
            cos_naming->unbind( name, env ); 
          } catch( CORBA::Exception& e ) {
              ; 
          }
          cos_naming->bind( name, _bind_obj, env ); 

          // POAマネージャの獲得
          poa_manager = childPOA->the_POAManager( env ); 

          // POAマネージャのactivate
          poa_manager->activate( env ); 

          orb->run( env ); 
      } catch( CORBA::Exception& e ) {
          cout << "exception-id: " << e.id() << endl; 
          exit(1); 
      }
      return 0; 
  }

  //ユーザクラス(インタフェース実装クラス)
  class UserServant
  {
  public: 
      UserServant(){}; 
      ~UserServant(){}; 
      CORBA::Long add(
                   CORBA::Long a, 
                   CORBA::Long b, 
                   CORBA::Environment& env ) 
                   throw( CORBA::Exception ) 
      {

          CORBA::Long    result; 

          cout << "ODsample::intf::add()" << endl; 
          cout << "  a     : " << a << endl; 
          cout << "  b     : " << b << endl; 
          result = a + b; 
          cout << "  result: " << result << endl; 
          return result; 
      }; 
  }; 

  POA_ODsample_intf* _ct_ODsample_intf() 
  {
      // ユーザクラスのインスタンス生成
      UserServant* impl = new UserServant(); 
      // tieオブジェクト作成とユーザクラスの登録
      POA_ODsample_intf_tie<UserServant>* tie = 
          new POA_ODsample_intf_tie<UserServant>( impl ); 
      return tie; 
  };

(6)例外情報の獲得

 サーバアプリケーションで例外を獲得する方法の詳細については、“サーバアプリケーションの例外処理”を参照してください。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005