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

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::BOA::impl_is_ready()/CORBA::BOA::obj_is_ready()が復帰せずにサーバアプリケーションが終了します。

  • サーバアプリケーションをプロセスモードで作成している場合  かつ

  • サーバアプリケーションをCORBAワークユニット運用している場合  かつ

  • CORBAワークユニットを停止した場合

CORBA::BOA::impl_is_ready()/CORBA::BOA::obj_is_ready()の後に後処理を行う場合は、サーバアプリケーションをスレッドモードで作成するか、またはワークユニットの出口機能を利用してください。ワークユニットの出口機能に関しては、“OLTPサーバ運用ガイド”の“ワークユニットの出口機能”を参照してください。

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.5 データ型に対するマッピング”を参照してください。

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コマンドでサーバアプリケーションを終了する場合は、アプリケーション側で非活性化用のメソッドを発行する必要はありません。