esmkchnlコマンドを使用してイベントチャネルを作成する際に、不揮発化を指定したことでアプリケーションへの影響はありませんが、メッセージングモデルにMultiCastモデルを使用した際に、チャネルダウンおよびシステムダウンなどが発生した場合のメッセージ保証をより確実に行う場合は、接続するイベントチャネルのオブジェクトリファレンスを、コンシューマで不揮発な媒体に保存しておく必要があります。
システムダウンが発生した場合は、復旧後にコンシューマを再起動する必要があります。
コンシューマを再起動した場合、チャネルに再接続することなく保存していたオブジェクトリファレンスを使用して受信処理から行えば、チャネルに蓄積されているデータを取得できます。
メッセージングモデルがPoint-To-Pointモデルである場合は、チャネルダウンおよびシステムダウンなどが発生した際にコンシューマが未起動の状態であっても、サプライヤがイベントチャネルにイベントデータを送信すると、イベントチャネルはイベントデータをチャネル内にキューイングします。そのため、接続するイベントチャネルのオブジェクトリファレンスを、コンシューマで不揮発な媒体に保存しておく必要はありません。コンシューマは、新たに接続して受信すれば、チャネルに蓄積されているデータを取得することができます。
保存するには、以下のような方法があります。
オブジェクトリファレンスをファイルに保存する。
オブジェクトリファレンスをネーミングサービスに保存する。
■オブジェクトリファレンスをファイルに保存する場合
オブジェクトを文字列に変換する場合は、ORBインタフェースとして提供されている、object_to_stringメソッドを使用します。
逆に、ファイルから取り出した文字列をオブジェクトに変換する場合は、string_to_objectメソッドを使用します。
処理の流れを以下に示します。
[C言語によるコンシューマ(ファイルへの保存)]
CORBA_Boolean func() { ... consumer = CosNotifyChannelAdmin_EventChannel_get_default_consumer_admin( object, &env ); /* 1 */ proxy_pull = CosNotifyChannelAdmin_ConsumerAdmin_obtain_notification_pull_supplier( consumer,ctype,&proxyID,&env ); /* 2 */ str = CORBA_ORB_object_to_string( orb, proxy_pull, &env ); /* 3 */ /* 文字列(str)をファイルに書き込む*/ ... }
イベントチャネル管理オブジェクトのオブジェクトリファレンスを獲得します。
イベントチャネルのオブジェクトリファレンスを獲得します。
オブジェクトリファレンスを文字列に変換します。
[C言語によるコンシューマ(ファイルからの取り出し)]
CORBA_Boolean func() { ... /* ファイルから文字列(str)を読み込む*/ proxy_pull= CORBA_ORB_string_to_object( orb, str, &env ); /* 1 */ recv = CosNotifyChannelAdmin_StructuredProxyPullSupplier_pull_structured_event( proxy_pull, &env ); /* 2 */ ... }
文字列をオブジェクトリファレンスに変換します。
イベントチャネルからイベントデータを受信します。
プログラミング方法については、“C.1 サンプルプログラムの種別”(Windows(R)システムの場合)/“D.1 サンプルプログラムの種別”(SolarisシステムおよびLinuxシステムの場合)の“ノーティフィケーションサービスのローカルトランザクション”または“ノーティフィケーションサービスのグローバルトランザクション”を参考にしてください。
■オブジェクトリファレンスをネーミングサービスに保存する場合
オブジェクトリファレンスをネーミングサービスに保存する場合は、ネーミングコンテキストインタフェースとして提供されている、bindメソッドを使用して登録します。
登録されたオブジェクトを削除する場合は、unbindメソッドを使用します。
処理の流れを以下に示します。
[C言語によるコンシューマ(ネーミングサービスへの保存)]
CORBA_Boolean func() { CosNaming_Name name; CosNaming_NameComponent name_component; ... consumer = CosNotifyChannelAdmin_EventChannel_get_default_consumer_admin( object, &env ); /* 1 */ proxy_pull = CosNotifyChannelAdmin_ConsumerAdmin_obtain_notification_pull_supplier( consumer,ctype,&proxyID,&env ); /* 2 */ /* シーケンス領域の設定(バインディング名 PROXY_A) */ name._length = name._maximum = 1; name._buffer = &name_component; name_component.id = "PROXY_A"; name_component.kind = ""; /* ネーミングサービスにオブジェクトリファレンスを登録 */ CosNaming_NamingContext_bind( cos_naming, &name, proxy_pull, &env ); /* 3 */ ... }
イベントチャネル管理オブジェクトのオブジェクトリファレンスを獲得します。
イベントチャネルのオブジェクトリファレンスを獲得します。
オブジェクトリファレンスをネーミングサービスに登録します。
[C言語によるコンシューマ(ネーミングサービスからの取り出し)]
CORBA_Boolean func() { CosNaming_Name name; CosNaming_NameComponent name_component; ... /* ルートからPROXY_Aを取得 */ name._length = name._maximum = 1; name._buffer = &name_component; name._buffer.id = "PROXY_A"; name._buffer.kind = ""; proxy_pull = CosNaming_NamingContext_resolve( cos_naming, &name, &env ); /* 1 */ recv = CosNotifyChannelAdmin_StructuredProxyPullSupplier_pull_structured_event( proxy_pull, &env ); /* 2 */ ... }
ネーミングサービスより、オブジェクトリファレンスを取得します。
イベントチャネルからイベントデータを受信します。
参照
ネーミングサービスを使用するプログラミング方法については、“アプリケーションガイド(CORBAサービス編)”を参照してください。
注意
コンシューマの終了時について
esmkchnlコマンドで-persistを指定して、かつ-tranまたは-otsを指定しない場合は、イベントチャネルでのメッセージ保証の制御により、コンシューマがpullメソッドを発行してイベントデータ受信後に終了します。その後、再度コンシューマを起動してpullを行うと、前回と同一のイベントデータを受信します。
イベントデータの重複を防止する場合は、コンシューマがpullメソッドを発行してイベントデータ受信後、終了する直前にget_MyTypeメソッドを発行してから終了するようにしてください。
コンシューマからdisconnectメソッドを発行した場合、不揮発化されている接続するイベントチャネルのオブジェクトリファレンス、および未取得のイベントデータが削除されるため、disconnectメソッドはコンシューマが不要になった場合にだけ発行してください。
また、disconnectメソッドを発行した場合、コンシューマが保存しているオブジェクトリファレンスは無効となるため、保存しているオブジェクトリファレンスを削除するようにしてください。