注意: | Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBはTuxedo 8.1で非推奨になり、サポートされなくなりました。 Oracle Tuxedo CORBA JavaクライアントおよびOracle Tuxedo CORBA JavaクライアントORBのテキスト参照、関連するコード・サンプルはすべてサードパーティのJava ORBライブラリの実装/実行の簡易化とプログラマによる参照だけに使用する必要があります。 |
注意: | サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートやドキュメントは提供していません。 |
Advancedサンプル・アプリケーションでは、ニュース・レポータが記事をポストし、ワイヤ・サービスがその記事をイベントとして通知サービスにポストし、ニュース・サブスクライバが記事を消費するニュース閲覧環境をシミュレートします。
Advancedサンプル・アプリケーションでは、CosNotificationサービスAPIを使用するC++の実装が用意されています。
Advancedサンプル・アプリケーションは、Oracle Tuxedo CORBA通知サービスを使用するレポータ・アプリケーション、サブスクライバ・アプリケーション、およびワイヤ・サービス・アプリケーションで構成されます。レポータ・アプリケーションは、クライアント・アプリケーションを実装します。このアプリケーションは、ニュース記事の入力をユーザーに促し、アプリケーション固有のIDLを使用してWireServiceサーバーを呼び出します。WireServiceサーバーは、イベントをポストします。サブスクライバは、共同クライアント/サーバー・アプリケーションを実装します。このアプリケーションは、イベントをサブスクライブおよびアンサブスクライブするときにはクライアントとして機能し、イベントを受信するときにはサーバーとして機能します。イベントを受信するために、サブスクライバは通知サービスによってイベント配信が必要なときに呼び出されるコールバック・オブジェクトを実装します。
注意: | UNIXシステムでは、ポートが再び利用可能になるまでに時間がかかるため(実際の時間はプラットフォームによって異なる)、サブスクライバを即座に再起動することはできません。あまりにも早く再起動すると、CORBA::OBJ_ADAPTER 例外が発生します。これが発生した場合は、少し待ってから再試行してください。Solarisシステムでは、ポートが利用可能になるまで最大10分かかります。ポートがまだ使用中かどうかを確認するには、"Restart -a | grep < the port number>" というコマンドを使用します。 |
このAdvancedサンプル・アプリケーションでは、Oracleシンプル・イベントAPI、CosNotificationサービスAPI、一時的および永続的なサブスクリプション、およびデータのフィルタ処理の使い方を例示します。
このAdvancedサンプル・アプリケーションでは、次の3つの実行可能ファイルを使用します(図 6-1を参照)。
イベント・ポスト元(WireServiceアプリケーション)では、構造化イベントのdomain_name
、type_name
、およびfilterable_data
フィールドを使用して3つのイベント(ニュース・イベント、サブスクライバ停止イベント、およびサブスクライバ取消しイベント)を作成します。
このイベントでは、ドメイン名は文字列であり、アプリケーションによって事前に「News」として設定されます。 型名は文字列であり、Reporterアプリケーションのユーザーによって実行時に定義されます。 型名は、ニュースのカテゴリ(「Sports」など)に設定されます。 フィルタ処理可能データには、名前/値ペアが格納されます。その名前は「Story」で、値はポストされるニュース記事の本文である文字列です。
このイベントでは、ドメイン名は文字列であり、アプリケーションによって事前に「NewsAdmin」として設定されます。 型名は文字列であり、アプリケーションによって事前に「Shutdown」として設定されます。 フィルタ処理可能データは使用しません。
このイベントでは、ドメイン名は文字列であり、アプリケーションによって事前に「NewsAdmin」として設定されます。 型名は文字列であり、アプリケーションによって事前に「Cancel」として設定されます。 フィルタ処理可能データは使用しません。
Subscriberアプリケーションでは、構造化イベントのdomain_name
、type_name
、およびfilterable_data
フィールドを使用して2つのサブスクリプションを作成します。1つはニュース記事を処理するニュース・サブスクリプション、もう1つはCancelイベントとShutdownイベントを処理する停止サブスクリプションです。実行時に、Subscriberアプリケーションでは通知サービスに対するそれら2つのサブスクリプションを確立します。
Subscriberアプリケーションでは、構造化イベントのdomain_name
、type_name
、およびfilterable_data
フィールドを使用して通知サービスのサブスクリプションを作成します。サブスクリプションでは、ドメイン名が「News」の内容の固定文字列として定義されます。実行時に、Subscriberアプリケーションではユーザーに「ニュース・カテゴリ」と「キーワード」を問い合せ、その入力を使用してサブスクリプションのtype_nameフィールドとdata_filterフィールドを定義します。当然、両アプリケーション(レポータとサブスクライバ)のユーザーが協力し、サブスクリプションの「ニュース・カテゴリ」文字列と「キーワード」文字列がイベントと一致するようにしなければなりません。そうしないと、サブスクライバにニュース・イベントは配信されません。サブスクリプションでは、記事の本文が文字列であり、その記事が構造化イベントのfilterable_data
フィールドの最初の名前/値ペアにあるものと想定され、filterable_data
フィールドのチェックが行われることはありません。
Subscriberアプリケーションでは、構造化イベントのdomain_nameフィールドとtype_nameフィールドを使用して通知サービスのサブスクリプションを作成します。サブスクリプションではdomain_nameが「NewsAdmin」の内容の固定文字列として定義され、type_nameが「Shutdown」または「Cancel」のいずれかの文字列として定義されます。filterable_dataフィールドは空の文字列です。
Reporterアプリケーションは、ShutdownイベントとCancelイベントを生成するだけでなく、ニュースを報告するためのユーザー・インタフェースを実装します。通知サービスを直に使用してイベントをポストするのではなく、WireServiceサーバーのメソッドを呼び出します。
WireServiceサーバーでは、通知サービスを使用して次の3種類のイベントをポストします。
通知サービスでは、これらのイベントをサブスクライバに配信します。
サブスクライバでは、通知サービスを使用してニュース・イベントの永続的なサブスクリプションを作成します。サブスクライバは、ニュース・イベントを受信して処理するための永続的なコールバック・オブジェクトを(NewsConsumer_i
サーバーント・クラスを通じて)実装します。サブスクライバがサブスクライブするときには、このコールバック・オブジェクトのオブジェクト参照が通知サービスに渡されます。一致するイベントが発生すると、通知サービスではこのコールバック・オブジェクトのpush_structured_event
メソッドを呼び出してイベントをサブスクライバにプッシュします。このメソッドはイベントを出力します。
サブスクライバでは、通知サービスを使用してShutdownイベントとCancelイベントの一時的なサブスクリプションも作成します。サブスクライバは、それらのイベントを受信して処理するためのコールバック・オブジェクトも(ShutdownConsumer_i
サーバーント・クラスを通じて)実装します。
サブスクライバが実行されると、ユーザーは名前の入力を求められます。このユーザーが初めてサブスクライバ・プログラムを実行すると、サブスクライバではNewsイベントの永続的なサブスクリプションが作成されます。そのために、サブスクライバはサブスクライブするニュース記事の種類とサブスクライバが動作するポート番号の入力をユーザーに要求します。サブスクライバはこのポートで動作し、サブスクライブして、サブスクリプションID、フィルタID(CosNotification API使用の場合)およびポート番号をファイルに書き込みます(ファイルの名前は<
user_name
>.pstore
)。サブスクライバは、次回の実行時に、ユーザーに名前の入力を要求し、ファイル<
user_name
>.pstore
を開いて、このユーザーのサブスクリプションID、フィルタID(CosNotification API使用の場合)およびポート番号をファイルから読み取ります。これで、ニュース・コールバック・オブジェクトのオブジェクト参照が永続的になるため、サブスクライバが毎回同じポート番号で動作するという要件が満たされます。
Subscriberでは一時的なサブスクリプションを作成して、ShutdownイベントとCancelイベントを受信するため、一時的なサブスクリプションはサブスクライバが実行および停止されるたびに作成および破棄されます。このサブスクリプションIDは、ファイル<
user_name
>.pstore
には書き出されません。
サブスクライバがShutdownイベントを受信すると、停止/コールバック・サブスクリプションが破棄されますが、Newsサブスクリプションはそのまま維持されます。 サブスクライバが停止された後で、それが再起動される前にNewsイベントがポストされた場合、そのイベントはサブスクライバが再起動された時点で配信されるか、またはエラー・キューに入れられます。 ntsadmin
ユーティリティを使用すると、エラー・キューからイベントを削除するか、配信を再試行できます。
イベントが再配信されるか、エラー・キューに入れられるかは、サブスクライバがすぐに再起動されるかどうかによって決まります。すぐに再起動されるかどうかは、キューの再試行パラメータによって決まります。キューの再試行パラメータの値については、advanced.inc
(通知サンプルのcommonディレクトリ)を参照してください。
Newsイベントには、カテゴリ(見出しなど)と記事(複数行のテキスト文字列)という2つのパートがあります。 Subscriberアプリケーションは、ニュース・カテゴリの入力をユーザーに求めます。 サブスクライバでは、カテゴリがその文字列と一致するニュース・イベントをサブスクライブします。 Reporterアプリケーションは、ニュース・カテゴリと記事の入力をユーザーに要求します。 レポータでは、ワイヤ・サービスのメソッドを呼び出して対応するニュース・イベントをポストします。 イベントは、そのカテゴリのニュースをサブスクライブしたサブスクライバだけに配信されます。
注意: | カテゴリは文字列です。 ReporterのユーザーとSubscriberのユーザーは同じ文字列を使用しなければなりません。 このサンプルには固定のカテゴリはありません。 したがって、ReporterのユーザーとSubscriberのユーザーは両者とも、カテゴリが要求されたときに(大文字と小文字の区別およびスペースの有無を含めて)同じ文字列を入力しなければなりません。 |
このサンプルではデータのフィルタ処理も利用します。 ユーザーが初めてSubscriberを実行すると、そのユーザーは「キーワード」の入力を要求されます。 カテゴリが一致し、記事にキーワードが含まれているイベントがサブスクライバに配信されます。 たとえば、ユーザーが「none」というキーワードを入力した場合、データのフィルタ処理は行われません。その場合、ユーザーは選択したニュース・カテゴリのすべてのイベントを受信することになります。 「smith」というキーワードを入力した場合、そのキーワードは“Story %% '.*smith.*'"
に変換されます。 この場合、文字列の含まれる「Story」というフィールドが存在し、その文字列が任意数の文字で始まり、リテラル文字列「smith」が含まれ、任意数の文字で終わっているイベントのみがサブスクリプションで受け入れられます。
このサンプルを実行するには、ReporterとSubscriberを少なくとも1つずつ実行する必要があります(それぞれ複数を実行することも可能)。 Reporterによってポストされたイベントは、(カテゴリに基づいて)一致するすべてのサブスクライバに配信されます。
また、サブスクライバは必ずイベントをポストする前に起動してください。 サブスクライバが起動する前にポストされたイベントは配信されません。
Introductoryサンプル・アプリケーションをビルドして実行するには、次の手順を行う必要があります。
"TUXDIR"
環境変数が適切なディレクトリ・パスに設定されていることを確認します。“JAVA_HOME"
の設定を解除します。make
ファイルがパスに含まれているようにします。 Microsoft Windowsの場合は、nmake
ファイルがパスに含まれているようにします。 Advancedサンプル・アプリケーションをビルドして実行する前に、システムでTUXDIR
環境変数が設定されていることを確認する必要があります。 ほとんどの場合、この環境変数はインストール手順の一環として設定済みです。 しかし、正確な情報が反映されているかどうかを確認することが必要です。
表 6-1は、Callbackサンプル・アプリケーションを実行するために必要な環境変数のリストです。
インストール中に定義された環境変数の情報が正しいことを確認するには、以下の手順に従います。
ksh prompt>export TUXDIR=
directorypath
Advancedサンプル・アプリケーションのファイルをローカル・マシンの作業ディレクトリにコピーする必要があります。
注意: | アプリケーション・ディレクトリとcommonディレクトリは同じ親ディレクトリにコピーしなければなりません。 |
Advancedサンプル・アプリケーションのファイルは、次のディレクトリに配置されています。
C++のAdvancedサンプル: drive:\tuxdir
\samples\corba\notification\advanced_cos_cxx
drive:\tuxdir
\samples\corba\notification\common
C++のAdvancedサンプル: /usr/local/tuxdir
/samples/corba/notification/advanced_cos_cxx
/usr/local/tuxdir
/samples/corba/notification/common
表 6-2と表 6-3のファイルは、CosNotification APIを使用して実装されるC++ Advancedサンプル・アプリケーションをビルドして実行するために使用します。
表 6-2と表 6-3のファイルは、Advancedサンプル・アプリケーションをビルドして実行するために使用します。
表6-3は、Advancedサンプル・アプリケーションで使用されるほかのファイルのリストです。IDLファイル以外のファイルは、通知の共通ディレクトリに配置されています。
Oracle Tuxedoソフトウェアのインストール時に、Advancedサンプル・アプリケーションのファイルは読取り専用に設定されます。 Advancedサンプル・アプリケーションのファイルを編集またはビルドするには、作業ディレクトリにコピーしたファイルの保護属性を次のように変更する必要があります。
UNIXオペレーティング・システム・プラットフォームでは、次のようにsetenv.ksh
のパーミッションを変更して実行可能にすることも必要です。
ksh prompt>chmod +x setenv.ksh
makefile
を実行するには、make
コマンドを使用します。makefileは、Microsoft WindowsおよびUNIXの両方でサンプル・アプリケーションをビルドするために使用します。 Microsoft Windowsでは、nmake
を使用します。 UNIXでは、make
を使用します。
setenv.cmd
)が実行済みであることを確認します。 環境変数が設定されていない場合は、エラー・メッセージを画面に出力して終了します。common.nt
コマンド・ファイル(Microsoft Windows)またはcommon.mk
コマンド・ファイル(UNIX)をインクルードします。 このファイルでは、サンプルで使用されるmakefileシンボルが定義されます。 それらのシンボルにより、UNIXおよびMicrosoft Windowsのmakefileでビルド規則をプラットフォームに依存しないmakefileに委譲することができます。makefile.inc
コマンド・ファイルをインクルードします。 このファイルでは、is_reporter
、is_subscriber
、およびAS_WIRESERVICE
の実行可能ファイルがビルドされ、不要なファイルとディレクトリがクリーンアップされます。advanced.inc
コマンド・ファイルをインクルードします。 このファイルでは、tmadmin
コマンドとqadmin
コマンドを実行してトランザクション・ログおよび永続的なサブスクリプションで必要なキューが作成されます。 さらに、UBBCONFIG
ファイルが作成され、tmloadcf -y ubb
コマンドを実行してTUXCONFIG
ファイルが作成されます。 makefile
を実行する前に、次の確認作業を行う必要があります。
Advancedサンプル・アプリケーションをビルドするには、make
コマンドを次のように入力します。
Advancedサンプル・アプリケーションを起動するには、次のコマンドを入力します。
このコマンドを入力すると、次のサーバー・プロセスが開始されます。
TMSUSREVT
通知サービスで使用される、Oracle Tuxedoシステムに付属のEventBrokerサーバー
TMNTS
サブスクリプションおよびイベントのポストのリクエストを処理するOracle Tuxedo CORBA通知サービス・サーバー
TMNTSFWD_T
一時的なサブスクリプションのあるサブスクライバにイベントを転送するOracle Tuxedo CORBA通知サービス・サーバー。このサーバーは、一時的なサブスクリプションで必須です。
TMNTSFWD_P
永続的なサブスクリプションのあるサブスクライバに永続的なイベントを転送するOracle Tuxedo CORBA通知サービス・サーバー。このサーバーは、永続的なサブスクリプションで必須です。
TMQUEUE
メッセージ・キュー・マネージャは、tpenqueue
(3)およびtpdequeue
(3)を呼び出してプログラムのかわりにキューのメッセージの登録と取出しを行うOracle Tuxedoシステム付属のサーバーです。このサーバーは、永続的なサブスクリプションで必須です。
TMQFORWARD
メッセージ転送サーバーは、後で処理するようにtpenqueue
(3c)を使用して格納されたメッセージを転送するOracle Tuxedoシステム付属のサーバーです。 このサーバーは、永続的なサブスクリプションで必須です。
WIRE_SERVICE_SERVER
Reporterアプリケーションからイベントを受信し、そのイベントを通知サービスにポストする、Advancedサンプル・アプリケーション用に特別にビルドされたサーバー。News、Shutdown、およびCancelという3タイプのイベントが受信およびポストされます。
ISL
Subscriberをもう1つ起動するには、別のウィンドウを開き、ディレクトリを作業ディレクトリに変更して(cd
)、環境変数を設定し(setenv.cmd
またはsetenv.ksh
を実行)、プラットフォームに適した起動コマンドを入力します。
Reporterをもう1つ起動するには、別のウィンドウを開き、ディレクトリを作業ディレクトリに変更して(cd
)、環境変数を設定し(setenv.cmd
またはsetenv.ksh
を実行)、プラットフォームに適した起動コマンドを入力します。
Advancedサンプル・アプリケーションを使用するには、Subscriberアプリケーションを使用してイベントをサブスクライブし、Reporterアプリケーションを使用してイベントをポストする必要があります。 サブスクライブは、各イベントをポストする前に行う必要があります。そうしないと、イベントは失われます。
注意: | SubscriberアプリケーションがReporterアプリケーションからのShutdownイベントによって実装された場合(Shutdownイベントでは永続的なサブスクリプションは取り消されない)、Subscriberアプリケーションの以降の起動では、名前以外は入力を要求されません。Subscriberアプリケーションは、名前以外の情報を<user_name>.pstore ファイルから取り出します。このようにすることで、同じポート番号が必ず使用されるようになります(永続的なサブスクリプションでは不可欠)。 |
注意: | SubscriberアプリケーションがReporterアプリケーションからのCancelイベントによって実装された場合(Cancelイベントでは永続的なサブスクリプションを含むすべてのサブスクリプションが取り消される)、Subscriberアプリケーションの以降の起動では、名前、ポート番号、カテゴリ、およびキーワードの入力が要求されます。 |
同様に、キーワードでも文字列を入力できます。 キーワードも決まったリストは存在しません。したがって、レポータを実行して記事を入力するときには、その記事に同じ文字列が含まれているようにしてください。そうしないと、記事はサブスクリプションに配信されません。
ユーザー名、カテゴリ(または「all」)、およびキーワード(オプション)の入力に基づいて初めてSubscriberアプリケーションが実行されたときには、ニュースのサブスクリプションが作成されます。 次以降の実行時には、サブスクライバではこのサブスクリプションが再利用されます。 Subscriberアプリケーションは常に、イベントを受信する準備ができた時点で「Ready」を出力します。
注意: | Subscriberアプリケーションは、サブスクリプションを作成し、イベント受信の準備ができた時点で「Ready」を出力します。 |
注意: | Reporterアプリケーションを使用してイベントをポストする前に、必ずSubscriberアプリケーションを使用してイベントをサブスクライブする必要があります。そうしないと、イベントは失われます。 SubscriberアプリケーションでNewsイベントの永続的なサブスクリプションが作成される場合でも、そのサブスクリプションはSubscriberアプリケーションが起動するまで作成されません。 |
注意: | 別のウィンドウを開いてこの手順を繰り返せば、複数のサブスクライバを起動できます。 |
prompt> is_reporter
)、次のプロンプトが表示されます。 (r) Report news
(s) Shutdown subscribers
(c) Cancel Subscribers
(e) Exit
r
を入力します。 次のプロンプトが表示されます。ニュース・カテゴリを入力すると、次のプロンプトが表示されます。
Enter story (terminate with '.')
カテゴリとキーワード(指定された場合)がこの記事と一致するサブスクライバが記事を受信して出力します。
「s」
オプションを選択すると、Shutdownイベントがポストされ、そのイベントがすべてのサブスクライバによって受信されて、それらのサブスクライバが停止されます。サブスクライバが停止されていても、再び「r」
オプションを使用すれば別のニュース記事をポストできます。通知サービスはそのニュース記事を保留キューに入れますが、Newsイベントのサブスクリプションは永続的であるため、依然として有効です。サブスクライバを再起動すると、サブスクライバはこの2番目のニュース記事を受信します(再起動の遅延によってイベントがエラー・キューに移動された場合を除く)。なぜなら、ニュース記事の永続的なサブスクリプションがサブスクライバによって作成されているからです。 注意: | ntsadmin retryerrevents コマンドを使用すると、エラー・キューのイベントを保留キューに移動することができます。 |
「c」
オプションを選択すると、Cancelイベントがポストされ、そのイベントがすべてのサブスクライバで受信されます。 サブスクライバは、ニュースのサブスクリプションを取り消し、停止されます。 サブスクライバを再起動するときには、新しいサブスクリプションを作成することになるので、ポート、カテゴリ、およびキーワードを再び入力する必要があります。(e)
オプションを選択します。注意: | 別のウィンドウを開いてこの手順を繰り返せば、複数のレポータを起動できます。 レポータによって報告されたニュース記事はすべて、一致するすべてのサブスクライバに配信されます。 システムを停止するときには、その前に必ずすべてのレポータを終了してください。 |
ReporterとSubscriberのプロセスが停止しているのを確認してから、次の手順を行ってください。