Interstage Application Server アプリケーション作成ガイド (イベントサービス編) |
目次
索引
![]() ![]() |
第4章 アプリケーションの開発(各機能) | > 4.4 不揮発チャネルのアプリケーション開発 |
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 */ ... }
プログラミング方法については、“サンプルプログラムの種別”(Windows(R)システムの場合)/“サンプルプログラムの種別”(Solaris(TM) Operating EnvironmentシステムおよびLinuxシステムの場合)の“ノーティフィケーションサービスのローカルトランザクション”または“ノーティフィケーションサービスのグローバルトランザクション”を参考にしてください。
なお、Solaris(TM) Operating Environmentは、本マニュアルでは“Solaris OE”と記述しています。
オブジェクトリファレンスをネーミングサービスに保存する場合は、ネーミングコンテキストインタフェースとして提供されている、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サービス編)”を参照にしてください。
コンシューマ終了時は以下のことに注意してください。
目次
索引
![]() ![]() |