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

4.1.1 アプリケーション異常終了時の接続情報の回収方法

アプリケーションの設計

(1)アプリケーションの基本シーケンス

  イベントサービスのアプリケーションは、Push,Pull,Mixedのすべてのモデルでイベントチャネルと接続した場合は、正常・異常時に関わらず必ずイベントチャネルと切断後、終了するように作成してください。



  アプリケーションで切断処理を行わなかった場合は、イベントチャネルに接続情報が残るため、イベントチャネルのデータが削除されないことがあります。このような状態は、Pullモデルのコンシューマまたは、Mixedモデルのコンシューマがイベントチャネルと切断しないで終了した場合に発生します。

  しかし、回線の切断やアプリケーションの異常終了などにより、設計どおりにイベントチャネルと切断ができない場合があります。イベントチャネルのコネクション自動回収機能を指定しなかった場合、イベントチャネルはアプリケーションとの接続情報を保持し続けます。
  例えば、Mixedモデルのコンシューマの場合は、イベントチャネルからデータをpullするアプリケーションが存在しないにも関わらずデータが蓄積される状態が発生します。
  イベントチャネルのコネクション自動回収機能を指定しなかった場合は、接続情報だけを回収する機能をサポートしていないため、ユーザアプリケーションで接続情報の回収を実装する必要があります。
  (2)に接続情報の回収方法を説明します。


(2)接続情報の回収方法

  回収方法の基本的な考え方は、アプリケーションが何らかの理由により切断できなかった場合に、他のアプリケーションが代行して接続情報を回収するものです。

  アプリケーションがイベントチャネル接続時のProxyのオブジェクトリファレンスをファイルに書き込み、他のアプリケーションがファイルからProxyのオブジェクトリファレンスを読み込み、イベントチャネルの接続情報を回収する方式の例を以下に示します(図中の★は、ユーザが作成するアプリケーションおよびファイルです)。
  なお、イベントチャネルとアプリケーションが動作するマシンが異なり、LANが断線した場合などは、アプリケーション側のマシンからは接続情報を回収できません。この場合は、回線の復旧を待つか、イベントチャネル側のマシンで回収用アプリケーションを実行してください。



  1. ユーザアプリケーションがイベントチャネルと接続します。

  2. イベントチャネルとの接続時のProxyのオブジェクトリファレンスを以下に示すメソッドを使用して文字列に変換します。変換した文字列はファイルに出力します。

    C:CORBA_ORB_object_to_string
    C++:CORBA::ORB::object_to_string
    Java:org.omg.CORBA.ORB.object_to_string
    COBOL:CORBA-ORB-OBJECT-TO-STRING

    C言語での実装例を以下に示します(Mixedモデルのコンシューマの場合)。

    [イベントサービスの場合]

    FILE                                      *fd;
    CORBA_string                              str;
      (省略)
    
    /* ---- イベントチャネルとの接続処理 ---- */
    CosEventChannelAdmin_ProxyPullSupplier_connect_pull_consumer(
                                    proxy, CORBA_OBJECT_NIL, &env );
    env_check( "ProxyPullSupplier_connect_pull_consumer", &env );
    
    /* ---- Proxyオブジェクトを文字列に変換してファイルに出力します ---- */
    str = CORBA_ORB_object_to_string( orb, proxy, &env );
    env_check( "CORBA_ORB_object_to_string", &env );
    fd = fopen( "proxy-file.txt", "w" );
    fprintf( fd, "%s", str );
    fclose( fd );

    [ノーティフィケーションサービスの場合]

    FILE                                      *fd;
    CORBA_string                              str;
    
    (省略)
    
    /* ---- イベントチャネルとの接続処理 ---- */
    CosNotifyChannelAdmin_StructuredProxyPullSupplier_connect_structured_pull_consumer(
                        proxy, CORBA_OBJECT_NIL, &env );
    env_check( " StructuredProxyPullSupplier_connect_structured_pull_consumer ", &env );
    
    /* ---- Proxyオブジェクトを文字列に変換してファイルに出力します ---- */
    str = CORBA_ORB_object_to_string( orb, proxy, &env );
    env_check( "CORBA_ORB_object_to_string", &env );
    fd = fopen( "proxy-file.txt", "w" );
    fprintf( fd, "%s", str );
    fclose( fd );
  3. イベントチャネルとアプリケーションの通信(push/pull)です。ここでアプリケーションが異常終了したと仮定します。
    ユーザは、アプリケーションの異常終了を検出した場合、回収用アプリケーションを実行してイベントチャネルの接続情報を回収します。

  4. 回収用アプリケーションは2で作成したファイルを読み込みます。ファイルから読み込んだ文字列を以下のメソッドでオブジェクトリファレンスに再変換します。

    C:CORBA_ORB_string_to_object
    C++:CORBA::ORB::string_to_object
    Java:org.omg.CORBA.ORB.string_to_object
    COBOL:CORBA-ORB-STRING-TO-OBJECT
  5. 変換したProxyのオブジェクトリファレンスを使用してイベントチャネルへ切断を発行します。
    C言語での実装例を以下に示します(Mixedモデルのコンシューマの場合)。
    [イベントサービスの場合]

    CosEventChannelAdmin_ProxyPullSupplier    proxy;
    FILE                                      *fd;
    char                                      str[4096];
      (省略)
    
    /* ---- ファイルから文字列を読み込みProxyオブジェクトに変換します ---- */
    fd = fopen( "proxy-file.txt", "r" );
    fscanf( fd, "%s", str );
    fclose( fd );
    proxy = CORBA_ORB_string_to_object( orb, str, &env );
    env_check( "CORBA_ORB_string_to_object", &env );
    
    /* ---- イベントチャネルとの切断処理 ---- */
    CosEventChannelAdmin_ProxyPullSupplier_disconnect_pull_supplier(
                                    proxy, &env );

    [ノーティフィケーションサービスの場合]

    CosNotifyChannelAdmin_StructuredProxyPullSupplier   proxy;
    FILE                                                *fd;
    char                                                str[4096];
    
    (省略)
    
    /* ---- ファイルから文字列を読み込みProxyオブジェクトに変換します ---- */
    fd = fopen( "proxy-file.txt", "r" );
    fscanf( fd, "%s", str );
    fclose( fd );
    proxy = CORBA_ORB_string_to_object( orb, str, &env );
    env_check( "CORBA_ORB_string_to_object", &env );
    
    /* ---- イベントチャネルとの切断処理 ---- */
    CosNotifyComm_StructuredPullSupplier_disconnect_structured_pull_supplier (
                        proxy, &env );