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

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

5.3.7.1 Default Servant使用例(デフォルトインスタンス方式)

(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 ret = obj2->add( 1, 2, env ); 

          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 );

          // Servantの生成
          ODsample_intf_impl* svt = new ODsample_intf_impl(); 
          // 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 ); 

          // ネーミングサービスのresolveメソッドを発行し、サーバアプリケーションの
          // オブジェクトリファレンスの獲得
          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; 
  }

  // Servant:メソッド実装
  CORBA::Long ODsample_intf_impl::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; 
  };

(6)例外情報の獲得

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


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

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