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

11.1.6 クライアントとの接続切断時の処理関数の登録

クライアントの異常終了などで接続が切断された場合は、スケルトンに実装されているインプリメンテーションクラスのデストラクタが自動的に呼び出されますが、デストラクタが実行される前に何らかの処理を行う場合は、その処理内容を記述した処理関数を登録します。
ここで登録された関数は、デストラクタが呼び出される直前に実行されます。


(1) 処理関数の形式

処理関数の形式を以下に示します。引数はvoidのポインタですが、呼出し時にthisポインタが渡されます。復帰値は、ありません。

void exit_func( void *this_pointer );

(2) 処理関数の登録

処理関数、CORBA::ORB::reg_exit_function()で登録します。登録は、CORBA::ORB_init()とCORBA::BOA::impl_is_ready()の間で行ってください。
登録例を以下に示します。

void exit_func( void *this_pointer )
{
    // 処理内容。例は後で示す。
}

int
main( int argc, char *argv[] ) 
{
    int    current_argc = argc; 
    ..... 
      
    // 初期化処理
    orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env ); 
      
    .... 
    
    // 処理関数の登録
    orb->reg_exit_function( orb, _INTF_ODsample_intf1, exit_func, env ); 
    
    .... 
    
    // サーバの活性化
    boa->impl_is_ready( impl, env ); 
}

(3) 処理関数の内容例

privateデータの内容と共に簡単な警告を出力します。ただし、privateメンバを参照するためには、exit_func関数をODsample_intf1_implクラスのfriend関数にしておく必要があります。

void exit_func( void *this_pointer ) 
{
    ODsample_intf1_impl *ptr = (ODsample_intf1_impl *)this_pointer; 
}

注意

CORBA::BOA::dispose()が発行された後にクライアントとの接続が切断された場合、登録された処理関数は呼び出されません。この場合も処理関数を実行する場合は、CORBA::BOA::dispose()の発行前に処理関数を実行してください。

void
ODsample_intf1_impl::destroy( CORBA::Environment &env ) 
    throw( CORBA::Exception ) 
{
    try {
        exit_func( this ); // 登録関数の明示的な呼び出し
        boa->dispose( this, env ); 
    }
    catch( CORBA::SystemException &se ) {
        throw( se ); 
    }
}