Tuxedo CORBA ノーティフィケーション サービス

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

Oracle シンプル イベント API の使い方

この章では、Oracle シンプル イベント API と C++ プログラミング言語を使用してノーティフィケーション サービス アプリケーションを作成するための開発手順を説明します。

ここでは、以下の内容について説明します。

注意 : 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 に関する技術的なサポートやマニュアルは提供していません。

 


開発プロセス

表 3-1 は、ノーティフィケーション サービス アプリケーションの開発プロセスの概略です。

表 3-1 開発プロセス
手順
説明
1
イベントの設計
2
イベントをポストするアプリケーションの記述
3
イベントをサブスクライブするアプリケーションの記述
4
ノーティフィケーション サービス アプリケーションのコンパイル

これらの手順については、以降の節で説明します。

 


イベントの設計

イベントの設計は、あらゆるノーティフィケーション サービスの基本です。イベントの設計は、一致するサブスクリプションに配信される情報の量だけでなく、ノーティフィケーション サービスの効率と性能にも影響します。したがって、計画を慎重に行って、ノーティフィケーション サービスが現在のニーズだけでなく将来の規模拡大にも対応できるようにする必要があります。イベント設計の説明については、「イベントの設計」を参照してください。

 


ステップ 1: イベントをポストするアプリケーションの記述

次のタイプの CORBA アプリケーションは、イベントをポストできます。

イベントをポストするために、アプリケーションでは最低でも次の機能を実装する必要があります。

以降の節では、これらの各機能について説明します。

イベント チャネルの取得

最初にイベント チャネルを取得しないと、クライアント アプリケーションではイベントをポストできません。

この開発ステップは、コード リスト 3-1 で示されています。コード リスト 3-1 は、Oracle シンプル イベント API を使用する Notification Service サンプル アプリケーションに基づいています。

イベント チャネル ファクトリのオブジェクト参照を取得するために、"Tobj_SimpleEventsService" 環境オブジェクトを使用して Bootstrap オブジェクトの resolve_initial_references メソッドが呼び出されます。取得したオブジェクト参照は、チャネル ファクトリを取得するために使用します。チャネル ファクトリは、イベント チャネルを取得するために使用します。コード リスト 3-1 は、C++ のサンプル コードを示しています。

コード リスト 3-1 イベント チャネルの取得 (C++)
// シンプル イベント チャネル ファクトリのオブジェクト参照を取得
CORBA::Object_var channel_factory_oref =
bootstrap.resolve_initial_references(
"Tobj_SimpleEventsService");
Tobj_SimpleEvents::ChannelFactory_var channel_factory =
Tobj_SimpleEvents::ChannelFactory::_narrow(
channel_factory_oref.in());
// チャネル ファクトリを使用してデフォルト チャネルを取得
Tobj_SimpleEvents::Channel_var channel =
channel_factory->find_channel(
Tobj_SimpleEvents::DEFAULT_CHANNEL);

イベントの作成とポスト

イベントをポストするには、まずイベントを作成しなければなりません。以下のリストは、Notification Service サンプル アプリケーションに基づいています。

コード リスト 3-2 は、C++ での実装を示しています。イベント チャネルにニュースを報告するために、このアプリケーションでは次の手順が実行されます。

  1. イベントを作成し、ドメイン名と型名を設定します。コード サンプルでは、ドメイン名は「News」、イベント型は「Sports」に設定されます。
  2. ニュース記事を格納するフィールドをイベントのフィルタ処理可能データに追加して、その追加フィールドの名前を「Story」に設定し、値を記事の文字列に設定します。
  3. push_structured_event オペレーションを使用して、イベントをノーティフィケーション サービスにポストします。
  4. コード リスト 3-2 イベントの作成とポスト (C++)
    // イベントを作成
    CosNotification::StructuredEvent notification;
    // ドメインを「News」に設定
    notification.header.fixed_header.event_type.domain_name =
    CORBA::string_dup("News");
    // 型をニュース カテゴリに設定
    notification.header.fixed_header.event_type.type_name =
    CORBA::string_dup(“Sports”);
    // 記事を格納するフィールドを 1 つイベントのフィルタ
    // 処理可能データに追加。フィールドの名前は「Story」、
    // 値は記事の文字列に設定
    notification.filterable_data.length(1);
    notification.filterable_data[0].name =
    CORBA::string_dup("Story");
    notification.filterable_data[0].value <<= “John Smith wins again”;
    // イベントをポスト
    // ドメインが「News」で、型がニュース カテゴリと一致する
    // イベントをサブスクライブしたサブスクライバがこのイベント
    // を受信する
    channel->push_structured_event(notification);

 


ステップ 2: イベントをサブスクライブするアプリケーションの記述

次のタイプの CORBA アプリケーションは、イベントをサブスクライブできます。

イベントをサブスクライブするために、アプリケーションでは最低でも次の機能を実装する必要があります。

CosNotifyComm::StructuredPushConsumer インタフェースの実装

コールバック オブジェクトでイベントを受信するためには、push_structured_event オペレーションをサポートする CosNotifyComm::StructuredPushConsumer インタフェースを実装する必要があります。一致するサブスクリプションがあるイベントが発生すると、ノーティフィケーション サービスではコールバック オブジェクトのこのオペレーションを呼び出してイベントをサブスクライバ アプリケーションにプッシュします。

CosNotifyComm::StructuredPushConsumer インタフェースでは、offer_change および disconnect_structured_push_consumer というオペレーションも定義されます。これらのオペレーションはノーティフィケーション サービスで呼び出されないので、CORBA::NO_IMPLEMENT を送出するスタブ アウト バージョンを実装する必要があります。

コード リスト 3-3コード リスト 3-4 は、このインタフェースが C++ でどのように実装されるのかを示しています。

コード リスト 3-3 CosNotifyComm::StructuredPushConsumer インタフェースのサンプル実装 (NewsConsumer_i.h)
#ifndef _news_consumer_i_h
#define _news_consumer_i_h
#include "CosNotifyComm_s.h"
// サーバント クラスでニュース イベントを受信するためには、
// CosNotifyComm::StructuredPushConsumer idl インタフェース
// を実装する必要がある
class NewsConsumer_i : public POA_CosNotifyComm::StructuredPushConsumer
{
public:
    // このメソッドはニュース イベントの発生時に呼び出される
    virtual void push_structured_event(
const CosNotification::StructuredEvent& notification
);
    // OMG の CosNotifyComm::StructuredPushConsumer idl インタフェース
    // では、offer_change メソッドと disconnect_structured_push_consumer
    // メソッドが定義される。ノーティフィケーション サービスからそれらの
    // メソッドが呼び出されることはないので、ただ単に CORBA::NO_IMPLEMENT
    // 例外を送出させる
    virtual void offer_change(
const CosNotification::EventTypeSeq& added,
const CosNotification::EventTypeSeq& removed )
{
throw CORBA::NO_IMPLEMENT();
}
    virtual void disconnect_structured_push_consumer()
{
throw CORBA::NO_IMPLEMENT();
}
};
#endif
コード リスト 3-4 CosNotifyComm::StructuredPushConsumer インタフェースのサンプル実装 (NewsConsumer_i.cpp)
#include "NewsConsumer_i.h"
#include <iostream.h>
//-----------------------------------------------------------
// Subscriber.cpp は「News」イベントのシンプル イベント
// サブスクリプションを作成し、イベントが NewsConsumer_i オブジェクト
// に配信されるようにする。ニュース イベントが発生すると (ユーザが
// Reporter アプリケーションを実行してニュース記事を報告すると発生する)、
// 次のメソッドが呼び出される
void NewsConsumer_i::push_structured_event(
const CosNotification::StructuredEvent& notification )
{
// イベントのフィルタ処理可能データの最初のフィールドから
// 記事を抽出する
char* story;
notification.filterable_data[0].value >>= story;
// コードを単純化するために、「story」は「null」ではないと想定
// イベントを出力
cout
<< "-----------------------------------------------------"
<< endl
<< "Category : "
<< notification.header.fixed_header.
event_type.type_name.in()
<< endl
<< "Story : "
<< story
<< endl;
...
}

イベント チャネルの取得

このステップは、イベント ポスト元とイベント サブスクライバの両方で同じです。このステップの説明については、「CosNotifyComm::StructuredPushConsumer インタフェースの実装」を参照してください。

コールバック オブジェクトの作成

イベントを受信するためには、アプリケーションはサーバであることも必要です。つまり、アプリケーションでは、サブスクライバのサブスクリプションと一致するイベントが発生したときに呼び出すことができるコールバック オブジェクトを実装しなければなりません。

コールバック オブジェクトを作成する手順は次のとおりです。

注意 : この手順は、Oracle Tuxedo CORBA 共同クライアント/サーバでの手順です。Oracle Tuxedo CORBA サーバでもイベントをサブスクライブできます。
  1. コールバック オブジェクトを作成します。コールバック オブジェクトは、BEAWrapper Callback API または CORBA ポータブル オブジェクト アダプタ (POA) を使用して実装できます。
  2. サーバントを作成します。
  3. コールバック サーバントのオブジェクト参照を作成します。

BEAWrapper コールバック オブジェクトとそのメソッドの詳細については、『Tuxedo CORBA プログラミング リファレンス』の「共同クライアント/サーバ」を参照してください。

注意 : BEAWrapper コールバック オブジェクトを使用してコールバック オブジェクトを作成する方法は、以下に説明します。POA を使用してコールバック オブジェクトを実装する方法については、『Oracle Tuxedo CORBA サーバ間通信』を参照してください。

コード リスト 3-5 は、C++ で、BEAWrapper コールバック オブジェクトを使用してコールバック オブジェクトを作成する方法を示しています。サンプル コードでは、NewsConsumber_i servant が作成され、start_transient メソッドを使用して一時的なオブジェクト参照が作成されます。

コード リスト 3-5 一時的なオブジェクト参照でコールバック オブジェクトを作成するサンプル コード (Introductory サンプル アプリケーションの Subscriber.cpp)
// このクライアントではコールバックをサポートする必要があるので
// コールバック ラッパー オブジェクトを作成する
BEAWrapper::Callbacks wrapper(orb.in());
NewsConsumer_i* news_consumer_impl = new NewsConsumer_i;
CORBA::Object_var news_consumer_oref =
wrapper.start_transient(
news_consumer_impl,
CosNotifyComm::_tc_StructuredPushConsumer->id()
);
CosNotifyComm::StructuredPushConsumer_var
news_consumer =
CosNotifyComm::StructuredPushConsumer::_narrow(
news_consumer_oref.in()
);

サブスクリプションの作成

サブスクライバでイベントを受信するためには、ノーティフィケーション サービスをサブスクライブする必要があります。一時的なサブスクリプションまたは永続的なサブスクリプションのいずれかを作成できます。

Introductory サンプル アプリケーションのコードであるコード リスト 3-6 は、C++ で一時的なサブスクリプションを作成する方法を示しています。

次の手順を実行する必要があります。

  1. サブスクリプションのサービス品質 (QoS) を一時的または永続的のいずれかに設定します。
  2. subscription_name (省略可能)、domain_nametype_name、および data_filter (省略可能) を指定します。
  3. サブスクリプションを作成します。サブスクリプションは、domain_nametype_namedata_filter (省略可能)、およびサービスの品質 (QoS) を設定し、サブスクライバのコールバック オブジェクトのオブジェクト参照をノーティフィケーション サービスに提供します。
  4. コード リスト 3-6 一時的なサブスクリプションの作成 (C++)
    // サービスの品質を TRANSIENT に設定
    CosNotification::QoSProperties qos;
    qos.length(1);
    qos[0].name =
    CORBA::string_dup(Tobj_SimpleEvents::SUBSCRIPTION_TYPE);
    qos[0].value <<=
    Tobj_SimpleEvents::TRANSIENT_SUBSCRIPTION;
    // 型をニュース カテゴリに設定
    const char* type = “Sports”;
    // サブスクリプションを作成する。ドメインを「News」に設定し、
    // データ フィルタを 30 を超える年齢に設定する
    Tobj_SimpleEvents::SubscriptionID subscription_id =
    channel->subscribe(
    subscription_name,
    "News", // ドメイン
    “Sports”, // 型
    "Age > 30", // データ フィルタ
    qos,
    news_consumer.in()
    );
注意 : データのフィルタ処理を利用する場合は、コンフィグレーション タスクも行う必要があります。データ フィルタ処理のコンフィグレーション要件については、「データ フィルタのコンフィグレーション」を参照してください。

C++ の Advanced サンプル アプリケーションのコードであるコード リスト 3-7 は、ノーティフィケーション サービスの永続的なサブスクリプションを作成するコード記述手順を示しています。永続的なサブスクリプションを作成する手順は、前述の一時的なサブスクリプションを作成する手順と同じです。

注意 : サンプル コードでは news_consumer コールバック オブジェクトのオブジェクト参照が永続的であると想定されていますが、一時的なコールバック オブジェクト参照で永続的なサブスクリプションを作成することもできます。一時的と永続的を対比させたコールバック オブジェクト参照の説明については、表 2-3 を参照してください。
コード リスト 3-7 永続的なサブスクリプションの作成 (Advanced の Subscriber.cpp)
CosNotification::QoSProperties qos;
qos.length(1);
qos[0].name =
CORBA::string_dup(Tobj_SimpleEvents::SUBSCRIPTION_TYPE);
qos[0].value <<= Tobj_SimpleEvents::PERSISTENT_SUBSCRIPTION;
CosNotifyComm::StructuredPushConsumer_var
news_consumer =
CosNotifyComm::StructuredPushConsumer::_narrow(
news_consumer_oref.in()
);
Tobj_SimpleEvents::SubscriptionID sub_id =
channel->subscribe(
subscription_info.subscription_name(),
"News", // ドメイン
“Sports”, // 型
“”, // データ フィルタなし
qos,
news_consumer.in()
)
);

C++ 共同クライアント/サーバ アプリケーションのスレッドに関する留意事項

共同クライアント/サーバ アプリケーションは、まずクライアント アプリケーションとして機能し、その後にサーバ アプリケーションにスイッチすることができます。そのために、共同クライアント/サーバ アプリケーションでは次の呼び出しを行って、スレッドの制御を完全にオブジェクト リクエスト ブローカ (ORB) に移します。

orb -> run();

共同クライアント/サーバ アプリケーションのサーバ部分のメソッドが ORB::shutdown() を呼び出すと、サーバのアクティビティはすべて停止し、共同クライアント/サーバ アプリケーションのサーバ部分で ORB::run() が呼び出されると、制御はステートメントに返されます。制御が共同クライアント/サーバ アプリケーションのクライアント機能に返されるのは、この条件においてのみです。

クライアント アプリケーションにはスレッドが 1 つしかないため、共同クライアント/サーバ アプリケーションのクライアント機能とサーバ機能で、中央演算処理装置 (CPU) を共有する必要があります。この共有は、ORB をときどき確認して、共同クライアント/サーバ アプリケーションに、実行すべきサーバ アプリケーション作業があるかどうかを調べることによって行われます。ORB の確認を実行するには、次のコードを使用します。

if ( orb->work_pending() ) orb->perform_work();

ORB はサーバ アプリケーションの作業を完了すると、共同クライアント/サーバ アプリケーションに戻ります。共同クライアント/サーバ アプリケーションはその後、クライアント アプリケーション機能を実行します。共同クライアント/サーバ アプリケーションでは、 ORB の不定期な確認を、確実に行う必要があります。行われない場合、共同クライアント/サーバ アプリケーションは呼び出しをまったく処理しません。

共同クライアント/サーバ アプリケーションが要求でブロックされている間は、ORB でコールバックを提供できないことに注意してください。共同クライアント/サーバ アプリケーションが別の Oracle Tuxedo CORBA サーバ アプリケーションのオブジェクトを呼び出した場合、その応答を待つ間 ORB はブロックされます。ブロック中の ORB はコールバックを扱うことができないため、要求が完了するまでコールバックはキュー入れられます。

 


ステップ 3: ノーティフィケーション サービス アプリケーションのコンパイルと実行

ノーティフィケーション サービス アプリケーション開発の最後のステップでは、アプリケーションをコンパイル、ビルド、および実行します。そのためには、次の手順を実行する必要があります。

  1. ノーティフィケーション サービスとイベント ポスト元アプリケーションおよびイベント サブスクライバ アプリケーションの間のインタフェースを定義するために必要なクライアント スタブ ファイルとスケルトン ファイルを生成します。イベント ポスト元アプリケーションとしては、クライアント、共同クライアント/サーバ、またはサーバが考えられます。イベント サブスクライバ アプリケーションとしては、共同クライアント/サーバまたはサーバが考えられます。
  2. アプリケーション コードをコンパイルし、スケルトン ファイルおよびクライアント スタブ ファイルに対してリンクします。
  3. アプリケーションをビルドします。
  4. アプリケーションを実行します。

クライアント スタブ ファイルとスケルトン ファイルの生成

クライアント スタブ ファイルとスケルトン ファイルを生成するには、アプリケーションで使用されるノーティフィケーション IDL ファイルごとに idl コマンドを実行する必要があります。表 3-2 は、各タイプのサブスクライバで使用する idl コマンドを示しています。

表 3-2 idl コマンドの要件
言語
Oracle Tuxedo CORBA 共同クライアント/サーバ
Oracle Tuxedo CORBA サーバ
C++
idl -P
idl

次に、idl コマンドの例を示します。

>idl -IC:\tuxdir\include C:\tuxdir\include\CosEventComm.idl

表 3-3 は、Oracle シンプル イベント インタフェースを使用する各タイプのノーティフィケーション サービス アプリケーションで必要な IDL ファイルを示しています。

表 3-3 ノーティフィケーション サービス アプリケーションで必要な IDL ファイル
アプリケーション タイプ
必要な OMG IDL ファイル
イベント ポスト元 (クライアント、共同クライアント/サーバ、またはサーバ)。スタブはすべてのファイルで必要。
CosEventComm.idl CosNotification.idl CosNotifyComm.idl Tobj_Events.idl Tobj_SimpleEvents.idl
サブスクライバ (サーバまたは共同クライアント/サーバ)。スタブはすべてのファイルで必要。スケルトンは CosNotifyComm.idl ファイルで必要。
CosEventComm.idl CosNotification.idl CosNotifyComm.idl Tobj_Events.idl Tobj_SimpleEvents.idl

アプリケーションのビルドと実行

ビルドの手続きは、ノーティフィケーション サービス アプリケーションのタイプによって異なります。表 3-4 は、各タイプのノーティフィケーション サービス アプリケーションをビルドするために使用するファイルのコマンドと種類を示しています。

表 3-4 アプリケーションのビルド要件
アプリケーション タイプ
クライアント
共同クライアント/サーバ
サーバ
C++ のイベント ポスト元
buildobjclient コマンドを使用して、アプリケーション ファイルと IDL スタブをコンパイルします。
-P オプションを設定した buildobjclient コマンドを使用して、アプリケーション ファイルと IDL スタブをコンパイルします。
buildobjserver コマンドを使用して、アプリケーション ファイルと IDL クライアント スタブをコンパイルします。
C++ のイベント サブスクライバ
適用されません。
-P オプションを設定した buildobjclient コマンドを使用して、アプリケーション ファイル、IDL スタブ、IDL スケルトンをコンパイルし、BEAWrapper ライブラリとリンクします。
buildobjserver コマンドを使用して、アプリケーション ファイル、IDL スタブ、および IDL スケルトンをコンパイルします。

コード リスト 3-8 は、Microsoft Windows システム上の C++ ポスト元アプリケーション (Reporter.cpp) で使用するコマンドを示しています。C++ の実行可能ファイルを作成するために、idl コマンドが必要な IDL ファイルで実行され、buildobjclient コマンドによって C++ クライアント アプリケーション ファイルと IDL スタブがコンパイルされます。

コード リスト 3-8 C++ Reporter アプリケーションのビルドと実行のコマンド (Microsoft Windows)
# idl コマンドを実行
idl -IC:\tuxdir\include C:\tuxdir\include\CosEventComm.idl \
C:\tuxdir\include\CosNotification.idl \
C:\tuxdir\include\CosNotifyComm.idl \
C:\tuxdir\include\Tobj_Events.idl \
C:\tuxdir\include\Tobj_SimpleEvents.idl
# buildobjclient コマンドを実行
buildobjclient -v -o subscriber.exe -f " \
-DWIN32 \
Reporter.cpp \
CosEventComm_c.cpp \
CosNotification_c.cpp \
CosNotifyComm_c.cpp \
Tobj_Events_c.cpp \
Tobj_SimpleEvents_c.cpp \
"
# アプリケーションを実行
is_reporter

コード リスト 3-9コード リスト 3-10 は、それぞれ Microsoft Windows および UNIX 上の C++ サブスクライバ アプリケーション (Subscriber.cpp) で使用するコマンドを示しています。C++ の実行可能ファイルを作成するために、-P オプションを設定した buildobjclient コマンドによって、共同クライアント/サーバ アプリケーション ファイル (Subscriber.cppNewsConsumer_i.cpp)、IDL スタブ、および IDL スケルトン (CosNotifyComm_s.cpp) がコンパイルされます。

コード リスト 3-9 C++ Subscriber アプリケーションのビルドと実行のコマンド (Microsoft Windows)
# idl コマンドを実行
idl -P -IC:\tuxdir\include C:\tuxdir\include\CosEventComm.idl \
C:\tuxdir\include\CosNotification.idl \
C:\tuxdir\include\CosNotifyComm.idl \
C:\tuxdir\include\Tobj_Events.idl \
C:\tuxdir\include\Tobj_SimpleEvents.idl
# buildobjclient コマンドを実行
buildobjclient -v -P -o subscriber.exe -f " \
-DWIN32 \
Subscriber.cpp \
NewsConsumer_i.cpp \
CosEventComm_c.cpp \
CosNotification_c.cpp \
CosNotifyComm_c.cpp \
CosNotifyComm_s.cpp \
Tobj_Events_c.cpp \
Tobj_SimpleEvents_c.cpp \ c:\tuxdir\lib\libbeawrapper.lib \
"
# アプリケーションを実行
is_subscriber
コード リスト 3-10 C++ Subscriber アプリケーションのビルドと実行のコマンド (UNIX)
# idl コマンドを実行
idl -P -I/usr/local/tuxdir/include /usr/local/tuxdir/include/CosEventComm.idl \
/usr/local/tuxdir/include/CosNotification.idl \
/usr/local/tuxdir/include/CosNotifyComm.idl \
/usr/local/tuxdir/include/Tobj_Events.idl \
/usr/local/tuxdir/include/Tobj_SimpleEvents.idl
# buildobjclient コマンドを実行
buildobjclient -v -P -o subscriber -f " \
Subscriber.cpp \
NewsConsumer_i.cpp \
CosEventComm_c.cpp \
CosNotification_c.cpp \
CosNotifyComm_c.cpp \
CosNotifyComm_s.cpp \
Tobj_Events_c.cpp \
Tobj_SimpleEvents_c.cpp \
-lbeawrapper \
"
# アプリケーションを実行
is_subscriber

  ページの先頭       前  次