■アプリケーションの設計
(1)アプリケーションの基本シーケンス
イベントサービスのアプリケーションにおいて、Push/Pull/Mixedのモデルでイベントチャネルと接続した場合は、正常・異常時に関わらず、必ずイベントチャネルと切断してから終了するように作成してください。
アプリケーションにおいて、Pullモデルのコンシューマ/Mixedモデルのコンシューマがイベントチャネルとの切断処理を行わないで終了した場合、イベントチャネルに接続情報が残るため、イベントチャネルのデータが削除されないことがあります。
なお、回線の切断やアプリケーションの異常終了などにより、設計どおりにイベントチャネルと切断できなかった場合、イベントチャネルはアプリケーションとの接続情報を保持し続けてしまうため、Mixedモデルのコンシューマは、イベントチャネルからデータをpullするアプリケーションが存在していなくてもデータが蓄積されてしまいます。
本現象を回避するためには、以下の「(2)接続情報の回収方法」のどちらかの手順で、不要となった接続情報を回収してください。
(2)接続情報の回収方法
イベントチャネル作成時に、コネクション自動回収機能を指定する
コネクション自動回収機能とは、アプリケーションの異常終了などにより、サプライヤ・コンシューマが静的生成イベントチャネルに対して切断処理を発行しないで終了した場合に、イベントチャネルに残ったコネクション情報の自動回収を行う機能です。
コネクション自動回収機能は、esmkchnlコマンドでイベントチャネルを作成する際、-autodisconオプションを指定することによりコネクション情報を自動回収する処理を有効とします。esmkchnlコマンドの詳細については、「リファレンスマニュアル(コマンド編)」の「イベントサービス運用コマンド」-「esmkchnl」を参照してください。
ただし、以下の場合は、コネクション自動回収機能を使用できません。「ユーザアプリケーションにおいて接続情報の回収を実装する」方法で接続情報を回収してください。
ファイル/ネーミングサービスに、サプライヤ/コンシューマのオブジェクトリファレンスを保存している。かつ、
サプライヤ/コンシューマの再起動時、イベントチャネルに再接続していない。かつ、
ファイル/ネーミングサービスに保存したオブジェクトリファレンスを使用して、送受信処理を行っている。
または
MessageQueueDirectorのイベントチャネル連携サービス/MQ連携サービスで使用している。
ユーザアプリケーションにおいて接続情報の回収を実装する
回収方法の基本的な考え方は、アプリケーションが何らかの理由により切断できなかった場合に、他のアプリケーションが代行して接続情報を回収するものです。
アプリケーションがファイルにイベントチャネル接続時のProxyのオブジェクトリファレンスを書き込み、他のアプリケーションがファイルからProxyのオブジェクトリファレンスを読み込み、イベントチャネルの接続情報を回収する方式の例を以下に示します(図中の★は、ユーザが作成するアプリケーションおよびファイルです)。
なお、イベントチャネルとアプリケーションが動作するマシンが異なり、LANが断線した場合などは、アプリケーション側のマシンから接続情報を回収することはできません。この場合、回線の復旧を待つか、イベントチャネル側のマシンで回収用アプリケーションを実行してください。
ユーザアプリケーションがイベントチャネルと接続します。
イベントチャネルとの接続時の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 );
イベントチャネルとアプリケーションの通信時(push/pull)に、アプリケーションが異常終了したと仮定します。
ユーザは、アプリケーションの異常終了を検出した場合、回収用アプリケーションを実行してイベントチャネルの接続情報を回収します。
回収用アプリケーションは、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
変換した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 );