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

第4章 アプリケーションの開発(各機能)> 4.1 イベントチャネル接続のアプリケーション開発

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

アプリケーションの設計

(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
        COBOL : CORBA-ORB-OBJECT-TO-STRING
        Java  : org.omg.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
        COBOL : CORBA-ORB-STRING-TO-OBJECT
        Java  : org.omg.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 );

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

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