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

4.2.1 静的スケルトンインタフェース

  サーバアプリケーションは、初期化処理部とインタフェースの実装部分から構成されます。初期化処理部では、以下に示す処理を行います。



4.2.1.1 初期化

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

  main ( int argc, char *argv[] ) 
  {
      CORBA::ORB_ptr          orb;    // ORBのオブジェクトリファレンス
      CORBA::Environment      env;    // 例外情報
      int                     current_argc = argc; 

      env = new CORBA::Environment; 
      orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );

  また、CORBA::ORB::BOA_init()の呼出しにより、基本オブジェクトアダプタの初期化処理を行います。

      CORBA::BOA_ptr  boa;                // BOA用オブジェクトリファレンス  
      boa = orb->BOA_init( current_argc, argv, CORBA_BOA_OAid, env );

  なお、必要であればサーバアプリケーションの初期化処理も行います。


4.2.1.2 サーバの活性化

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

サーバのタイプ

メソッド

shared server

CORBA::BOA::impl_is_ready

unshared server

CORBA::BOA::obj_is_ready

persistent server

CORBA::BOA::impl_is_ready


(1)インプリメンテーションリポジトリのオブジェクトリファレンスの獲得

  インプリメンテーションリポジトリのオブジェクトリファレンスを取り出します。メソッドのパラメタには、CORBA_ORB_ObjectId_ImplementationRepositoryを指定します。


(2)ImplementationDefオブジェクトのオブジェクトリファレンスの検索

  FJ::ImplementationRep::lookup_id()を使用して、ImplementationDefオブジェクトのオブジェクトリファレンスを求めます。パラメタには、サーバアプリケーションのImplementationRepオブジェクトを指定します。


(3)サーバの活性化

  CORBA::BOA::impl_is_ready()またはCORBA::BOA::obj_is_ready()を使用して、サーバの活性化を行います。

  サーバアプリケーションはプロセスで実装するかスレッドで実装するかにより、メソッドの動作が異なります。また、スレッドで実装する場合、インプリメンテーションリポジトリ内に設定されている情報によっても異なります。動作の違いを以下に示します。

条件

動作

プロセスで実装

OD_impl_instでmode=SYNC_END

メソッドは即時に復帰せず、このオブジェクトの停止がオペレータにより指示されたときに復帰します。()

スレッドで実装

OD_impl_instでmode=SYNC_END

同上

OD_impl_instでmode=COMPATIBLE

メソッドは即時に復帰します。
その後、thr_exitを呼び出す必要があります。

注) メソッドの復帰後は、初期化時にオープンしたファイルのクローズ処理や、領域の解放処理等の非活性化処理(“4.2.1.4 サーバの非活性化”を参照)が必要です。

  CORBA::ImplementationDef_ptr impl;     // インプリメンテーション情報検索用
  ImplementationRep_ptr        impl_rep; // ImplementationRepオブジェクトリファレンス
  CORBA::Object_ptr            o;        // オブジェクトリファレンスのポインタ

  // インプリメンテーション情報のオブジェクトリファレンス検索
  o = orb->resolve_initial_references(
      CORBA_ORB_ObjectId_ImplementationRepository, env );

  // ImplementationRepクラスへの変換
  impl_rep = FJ::ImplementationRep::_narrow(o); 

  // サーバのImplementationRepオブジェクトの検索
  o = impl_rep->lookup_id( _IMPL_ODdemo_calculator, env );

  // ImplementationDefクラスへの変換
  impl = CORBA::ImplementationDef::_narrow(o); 

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

4.2.1.3 インタフェース実装関数

  初期化処理の後、サーバアプリケーションで実装するインタフェースの処理を記述します。インタフェースを実装する方法として、以下の2種類があります。


implクラス方式

  派生クラスのメソッドとして実装する方法です。以下に特長を示します。

TIEクラス方式

  テンプレートクラス機能を利用して実装する方法です。以下に特長を示します。

備考
  TIEクラス方式を使用する場合は、IDLcコマンド実行時に-tieオプションを指定する必要があります。

  それぞれの実装方法について、以下のIDL定義をもとに説明します。
  なお、アプリケーションで使用可能なCORBAのデータ型については“4.6 データ型に対するマッピング”を参照してください。

IDLファイル
  module ODdemo{
      interface  calculator{
          exception ZEROPARAM {};
          struct result {
              long     add_result; 
              long     subtract_result; 
              long     multiple_result; 
              float    divide_result; 
          };
          result calculate( in long a, in long b ) 
              raises( ZEROPARAM ); 
      };
  };

(1)implクラス方式

  implクラスを使用する場合、以下を記述します。
    インタフェース実装関数


インタフェース実装関数

  インタフェース実装関数は、“モジュール名_インタフェース名_impl”という名前で定義されたインタフェース実装クラスのメンバ関数として実装します。

// IDLで生成されるヘッダ定義
  class ODdemo_calculator_impl {
  public: 
      ODdemo::calculator::result calculate( CORBA::Long, CORBA::Long, CORBA::Environment & ) 
            throw ( CORBA::Exception ); 
  }

  // インタフェースの実装
  ODdemo::calculator::result                  // 復帰値の型
  ODdemo_calculator_impl::calculate(          // addメソッドの実装
      CORBA::Long  a,                         // 入力値
      CORBA::Long  b,                         // 入力値
      CORBA::Environment & )                  // エラー値
      throw( CORBA::Exception ) 
  {
      if( b == 0 ){                           // 0除算チェック
          ODdemo::calculator::ZEROPARAM  exc;
          throw( exc ); 
      }

      ODdemo::calculator::result res; 
      res.add_result = a+b;                   // 加算結果設定
      res.subtract_result = a-b;              // 減算結果設定
      res.multiple_result = a*b;              // 乗算結果設定
      res.divide_result = (CORBA::Float)a/b;  // 除算結果設定
      return res; 
  }

(2)TIEクラス方式

  TIEクラスを使用する場合、以下を記述します。
    インタフェース実装クラス
    インタフェース実装関数
    インタフェース実装クラス割当て関数


インタフェース実装クラス

  インタフェース実装クラスには、以下の定義をpublic属性として含める必要があります。
    デフォルトコンストラクタ
    デストラクタ
    オペレーション/アトリビュートの実装関数

  オペレーションとアトリビュートの実装関数は、IDLコンパイラが生成するヘッダに定義されているインタフェースと同一の名前にします。ただし、“throw( CORBA::Exception )”は必要ありません。

  その他のメンバ定義やクラス名は適宜追加することができます。

  class  CalculatorImpl {
  public:
      CalculatorImpl();        //コンストラクタの宣言
      ~CalculatorImpl();       //デストラクタの宣言
      ODdemo::calculator::result
      calculate  (             //オペレーションの宣言
            CORBA::Long    a,
            CORBA::Long    b,
            CORBA::Environment  & );
  };

インタフェース実装関数

  インタフェース実装関数は、インタフェース実装クラスのメンバ関数として定義します。
  デフォルトコンストラクタとデストラクタでは、特定の処理を記述する必要はありませんが、独自の処理を記述することもできます。

  CalculatorImpl::CalculatorImpl()
  {
  }

  CalculatorImpl::~CalculatorImpl()
  {
  }

  ODdemo::calculator::result                  // 復帰値の型
  CalculatorImpl::calculate(                  // メソッドの実装
      CORBA::Long    a,                       // 入力値
      CORBA::Long    b,                       // 入力値
      CORBA::Environment   & )                // エラー値
  {
      if( b == 0 ){                               // 0除算チェック
          ODdemo::calculator::ZEROPARAM  exc;
          throw( exc );
      }
      ODdemo::calculator::result res;
      res.add_result = a+b;                       // 加算結果設定
      res.subtract_result = a-b;                  // 減算結果設定
      res.multiple_result = a*b;                  // 減算結果設定
      res.divide_result = (CORBA::Float)a/b;      // 除算結果設定
    return res;
  }

インタフェース実装クラス割当て関数

  インタフェース実装クラス割当て関数は、インタフェース実装クラスを生成し、TIEクラスにインスタンスを設定します。この関数は、クライアントからリクエストを受け取ったときに自動的に呼び出され、インタフェース実装クラスのインスタンスが生成されます。
  TIEクラスとインタフェース実装クラス割当て関数の名前は以下のようになります。


      TIEクラス: _tie_インタフェース名
      インタフェース実装クラス割当て関数: インタフェースクラス_ptr _ct_インタフェース名();


  インスタンスの生成はデフォルトコンストラクタで行う必要はなく、パラメタ付きのコンストラクタやoperator演算子などを利用して行うようにすることもできます。TIEクラスにインスタンスを設定するためのコンストラクタは1つに限定されており、TIEクラスを割り当てるときは必ずインタフェース実装クラスのインスタンスを引数として渡さなければなりません。

  ODdemo::calculator_ptr  _ct_ODdemo_calculator()
  {
      CalculatorImpl  *impl = new CalculatorImpl();
      _tie_ODdemo_calculator<CalculatorImpl>    *tie
             = new _tie_ODdemo_calculator<CalculatorImpl>(*impl);
      return  tie;
  }

4.2.1.4 サーバの非活性化

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

サーバのタイプ

メソッド

shared server

CORBA::BOA::deactivate_impl

unshared server

CORBA::BOA::deactivate_obj

persistent server

CORBA::BOA::deactivate_impl

  deactivate_implでは、サーバアプリケーションのImplementationRepオブジェクトをパラメタとして指定します。deactivate_objでは、オブジェクトリファレンスをパラメタとして指定します。

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

  なお、ワークユニット運用している場合は、isstopwuコマンドやInterstage管理コンソールから停止操作が実行されることにより、クライアントからの要求を以降受け付けない旨をORBに対して通知します。そのため、アプリケーション側で非活性化用のメソッドを発行する必要はありません。
  ワークユニット運用でないCORBAアプリケーションの場合も、odcntlqueコマンドでサーバアプリケーションの終了を行う場合は、アプリケーション側で非活性化用のメソッドを発行する必要はありません。