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

第11章 CORBAアプリケーションの高度な使い方> 11.1 Factory

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

(4) 注意事項

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

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

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