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メソッドを発行した場合、コンシューマが保存しているオブジェクトリファレンスは無効となります。保存しているオブジェクトリファレンスは、削除してください。