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

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