bea ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > Tuxedo > Tuxedo CORBA サーバ間通信 > C++ 共同クライアント/サーバ・アプリケーションの開発 |
Tuxedo CORBA サーバ間通信
|
C++ 共同クライアント/サーバ・アプリケーションの開発
ここでは、以下の内容について説明します。
開発プロセス
表 2-1 では、C++ 共同クライアント/サーバ・アプリケーションの開発プロセスの概略を示します。
表 2-1 C++ 共同クライアント/サーバ・アプリケーションの開発プロセス
これらの手順については、以降の節で説明します。 共同クライアント/サーバ・アプリケーション内のコールバック・オブジェクトはトランザクションに関与せず、オブジェクト管理機能を持たないため、このオブジェクト用のインプリメンテーション・コンフィギュレーション・ファイル (filename.icf) を作成する必要はありません。ただし、BEA Tuxedo アプリケーション内の BEA Tuxedo オブジェクトの ICF ファイルは作成する必要があります。ICF ファイルの記述については、『BEA Tuxedo CORBA サーバ・アプリケーションの開発方法』を参照してください。
Chat Room サンプル・アプリケーション
ここでは、Chat Room サンプル・アプリケーションを使用して開発の手順を説明します。チャット・ルームとは、さまざまな場所にいる人々が相互に通信できるアプリケーションです。ログインしたクライアント・アプリケーションをトラッキングし、それらにメッセージを配信する役目を持つモデレータが、チャット・ルームであると考えてください。
クライアント・アプリケーションは、ユーザ名を指定してモデレータにログインします。キーボードにメッセージが入力されると、クライアント・アプリケーションはモデレータを呼び出してそのメッセージを渡します。次に、モデレータはコールバック・オブジェクトを呼び出して、ほかのすべてのクライアント・アプリケーションにメッセージを配信します。
Chat Room サンプル・アプリケーションは、C++ 共同クライアント/サーバ・アプリケーションおよび BEA Tuxedo サーバ・アプリケーションで構成されています。共同クライアント/サーバ・アプリケーションはキーボード入力を受け取り、モデレータに対して呼び出しを行います。また共同クライアント/サーバ・アプリケーションは、モデレータからのメッセージをリッスンする、つまりモデレータからの呼び出しを受信するように、コールバック・オブジェクトを設定します。Chat Room サンプル・アプリケーションの BEA Tuxedo サーバ・アプリケーションでは、モデレータがインプリメントされます。
図2-1 では、Chat Room サンプル・アプリケーションがどのように動作するのかを示します。
図 2-1 Chat Room サンプル・アプリケーションの動作方法
Chat Room サンプル・アプリケーションは、次のように動作します。
Chat Room サンプル・アプリケーションのソース・ファイルは、BEA Tuxedo ソフトウェア・ディレクトリの TUXDIR¥samples¥corba¥chatroom ディレクトリに格納されています。詳細については、第 2 章の 30 ページ「Chat Room サンプル・アプリケーションのビルドと実行」を参照してください。
ステップ 1: OMG IDL の記述
使用できる CORBA インターフェイスをクライアント・アプリケーションに記述するには、Object Management Group (OMG) インターフェイス定義言語 (IDL) を使用します。OMG IDL で記述したインターフェイス定義を使用すると、完全に CORBA インターフェイスを定義し、各オペレーションの引数を指定できます。OMG IDL は、純粋な宣言型言語です。つまり、インプリメンテーションの詳細は含まれていません。OMG IDL の詳細については、『BEA Tuxedo CORBA クライアント・アプリケーションの開発方法』を参照してください。
Chat Room サンプル・アプリケーションにでは、表 2-2 に示した CORBA インターフェイスがインプリメントされます。
リスト2-1 は、Listener インターフェイスを定義する chatclient.idl を示します。 コード リスト 2-1 Listner インターフェイスの OMG IDL リスト2-2 は、Chat Room サンプル・アプリケーションの Moderator および ModeratorFactory インターフェイスを定義する chatroom.idl を示します。別の OMG IDL ファイルのインターフェイスに対するリファレンスを解決するには、 #include を使用します。Chat Room サンプル・アプリケーションでは、signon メソッドにはパラメータとして Listener オブジェクトが必要であり、その IDL ファイルは Listener インターフェイスを定義する OMG IDL ファイルを #include している必要があります。 コード リスト 2-2 Moderator および ModeratorFactory インターフェイスの OMG IDL
module ChatClient{
interface Listener {
oneway void post (in string from,
in string output_line);
};
};#include "ChatClient.idl"
module ChatRoom {
interface Moderator {
exception IdAlreadyUsed{};
exception NoRoomLeft{};
exception IdNotKnown{};
void signon( in string who,
in ChatClient::Listener callback_ref )
raises( IdAlreadyUsed, NoRoomLeft );
void send (in string who,
in string input_line )
raises( IdNotKnown );
void signoff(in string who )
raises( IdNotKnown );
}; interface ModeratorFactory {
Moderator get_moderator( in string chatroom_name );
};
};
ステップ 2: スケルトンおよびクライアント・スタブの生成
OMG IDL で定義したインターフェイス仕様は、IDL コンパイラによってスケルトンおよびクライアント・スタブの生成に使用されます。共同クライアント/サーバ・アプリケーションは、BEA Tuxedo オブジェクトにクライアント・スタブを、コールバック・オブジェクトにスケルトンおよびクライアント・スタブを使用することに注意してください。
たとえば Chat Room サンプル・アプリケーションでは、共同クライアント/サーバ・アプリケーションは Listener オブジェクト (つまりコールバック・オブジェクト) のためのスケルトンおよびクライアント・スタブを使用して、オブジェクトをインプリメントします。また、共同クライアント/サーバ・アプリケーションは Moderator および ModeratorFactory インターフェイスのためのクライアント・スタブを使用して、オブジェクトのオペレーションを呼び出します。BEA Tuxedo サーバ・アプリケーションは Moderator および ModeratorFactory オブジェクトのスケルトンを使用してオブジェクトをインプリメントし、Listener オブジェクトのためのクライアント・スタブを使用してオブジェクトのオペレーションを呼び出します。
開発プロセスでは、idl コマンドを -P および -i の各オプションを指定して使用し、コールバック・オブジェクトを定義する OMG IDL ファイルをコンパイルします。たとえば Chat Room サンプル・アプリケーションでは、chatclient.idl ファイルが OMG IDL ファイルです。各オプションは、次のように動作します。
次に、BEA Tuxedo サーバ・アプリケーションのインターフェイスを定義する OMG IDL ファイルをコンパイルする必要があります。たとえば Chat Room サンプル・アプリケーションでは、chatroom.idl ファイルが OMG IDL ファイルです。この OMG IDL ファイルをコンパイルするには、idl コマンドを -i オプションのみ指定して使用します。
表 注記 に、idl コマンドによって作成されるファイルの一覧を示します。
注記 Chat Room サンプル・アプリケーションでは、ChatClient.idlおよびChatRoom.idl の各ファイル用に生成されたテンプレート・ファイルは、それらによってインプリメントされるオブジェクト (Listener および Moderator) を反映するよう名前を変更されています。また、Moderator オブジェクト用のテンプレート・ファイルには、ModeratorFactory オブジェクトのインプリメンテーションが含まれています。
ステップ 3: 各オブジェクトのオペレーションをインプリメントするメソッドの記述
各 OMG IDL ファイルをコンパイルしたら、各オブジェクトのオペレーションをインプリメントするメソッドを記述する必要があります。共同クライアント/サーバ・アプリケーションでは、コールバック・オブジェクト (つまり Listener オブジェクト) のインプリメンテーション・ファイルを記述します。コールバック・オブジェクトのインプリメンテーションは、ほかの CORBA オブジェクトのインプリメンテーションと同じように記述しますが、TP フレームワークの代わりに POA を使用する点が異なります。また、BEA Tuxedo サーバ・アプリケーションの BEA Tuxedo オブジェクト (Moderator および ModeratorFactory オブジェクト) のインプリメンテーション・ファイルも記述します。
インプリメンテーション・ファイルには、以下のものが含まれます。
activate_object メソッドおよび deactivate_object メソッド内では、オブジェクトの活性化または不活性化に関連する特定の手順を実行するコードを記述します。
リスト2-3 は Listener オブジェクトのインプリメンテーション・ファイルを、リスト2-4 は Moderator および ModeratorFactory オブジェクトのインプリメンテーション・ファイルを示します。
注記 Moderator および ModeratorFactory オブジェクトのインプリメンテーション・ファイルには、メソッドとデータがさらに追加されています。インプリメンテーション・ファイルのテンプレートは、idl -i コマンドによって作成されています。
コード リスト 2-3 Listener オブジェクトのインプリメンテーション・ファイル
// このモジュールにはインプリメンテーション・クラス Listener_i の定義が
// 含まれる
#ifndef _Listener_i_h
#define _Listener_i_h
#include "ChatClient_s.h"
class Listener_i : public POA_ChatClient::Listener {
public:
Listener_i ();
virtual ~Listener_i();
void post (
const char * from,
const char * output_line);
...
};
#endif
コード リスト 2-4 Moderator および ModeratorFactory オブジェクトのインプリメンテーション・ファイル
// このモジュールにはインプリメンテーション・クラス Moderator および ModeratorFactory の定義が
// 含まれる
#ifndef _Moderator_i_h
#define _Moderator_i_h
#include "ChatRoom_s.h"
const int CHATTER_LIMIT = 5;
// チャット参加者の最多許容人数
class Moderator_i : public POA_ChatRoom::Moderator {
public:
// オペレーションを定義
void signon ( const char* who,
ChatClient::Listener_ptr callback_ref);
void send ( const char * who,
const char * input_line);
void signoff ( const char * who);
// フレームワーク関数を定義
virtual void activate_object ( const char* stroid );
virtual void deactivate_object( const char* stroid,
TobjS::DeactivateReasonValue
reason);
private:
// リスト内の名前を見つける関数を定義
int find( const char * handle );
// モデレータによって監督されるチャット・ルームの名前を定義
char* m_chatroom_name;
// リスト Chatter[n] id を維持するための
// データ
CORBA::String chatters[CHATTER_LIMIT];
// Chatter[n] のコールバック・リファレンス
ChatClient::Listener_var callbacks[CHATTER_LIMIT];
};
class ModeratorFactory_i : public POA_ChatRoom::ModeratorFactory {
public:
ChatRoom::Moderator_ptr get_moderator ( const char*
chatroom_name );
};
#endif
ステップ 4: 共同クライアント/サーバ・アプリケーションのクライアント部分の記述
共同クライアント/サーバ・アプリケーションの開発では、そのクライアント部分を BEA Tuxedo クライアント・アプリケーションと同じように記述します。クライアント・アプリケーションには、次の処理を行うコードを含める必要があります。
注記 BEA Tuxedo 製品のうち、CORBA 環境のリリース 8.0 には、BEA WebLogic Enterprise の旧リリースで提供されていた BEA クライアント環境オブジェクトが引き続き含まれており、BEA Tuxedo 8.0 CORBA クライアントでも使用できます。BEA Tuxedo 8.0 クライアントは、これらの環境オブジェクトを使用して、ブートストラップ処理、セキュリティ、およびトランザクション・オブジェクトへの初期リファレンスを解決する必要があります。このリリースでは、OMG インターオペラブル・ネーミング・サービス(INS)を使用してブートストラップ処理、セキュリティ、およびトランザクション・オブジェクトへの初期リファレンスを解決するためのサポートが追加されています。INS の詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』の「第 4 章 CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。
クライアントの開発手順を、リスト2-5 で説明します。これは Chat Room サンプル・アプリケーションのコードの一部です。Chat Room サンプル・アプリケーションでは、共同クライアント/サーバ・アプリケーションのクライアント部分がファクトリを使用して Moderator オブジェクトへのオブジェクト・リファレンスをを取得し、次に Moderator オブジェクトの signon、send、および signoff メソッドを呼び出します。
コード リスト 2-5 Chat Room 共同クライアント/サーバ・アプリケーションのクライアント部分
...
// ORB の初期化
orb_ptr = CORBA::ORB_init(argc, argv, "BEA_IIOP");
// Bootstrap オブジェクトを作成して、
// ドメインとの通信を確立
bootstrap = new Tobj_Bootstrap(orb_ptr,"");
// FactoryFinder オブジェクトを取得し、それを使用して Moderator ファクトリを検索し、
// Moderator を取得
// Bootstrap オブジェクトを使用して FactoryFinder オブジェクトを見つける
CORBA::Object_var var_factory_finder_oref =
bootstrap->resolve_initial_references("FactoryFinder");
// FactoryFinder オブジェクトをナロー変換
Tobj::FactoryFinder_var var_factory_finder =
Tobj::FactoryFinder::_narrow(var_factory_finder_oref.in());
// FactoryFinder オブジェクトを使用して Moderator のファクトリを見つける
CORBA::Object_var var_moderator_factory_oref =
var_factory_finder->find_one_factory_by_id(
"ModeratorFactory" );
// ModatatorFactory をナロー変換
ChatRoom::ModeratorFactory_var var_moderator_factory =
ChatRoom::ModeratorFactory::_narrow(
var_moderator_factory_oref.in() );
// Moderator を取得
// チャット・ルーム名がコマンド行パラメータとして渡される
var_moderator_oref =
var_moderator_factory->get_moderator
(var_chat_room_name.in() );
...
ステップ 5: コールバック・ラッパー・オブジェクトを使用したコールバック・オブジェクトの作成
コールバック・オブジェクトの基本的な作成手順は常に同じであるため、BEA Tuxedo 製品ではコールバック・オブジェクトの開発を簡略化するコールバック・ラッパー・オブジェクトを提供しています。
コールバック・ラッパー・オブジェクトは、以下のことを行います。
コールバック・オブジェクトに対するオブジェクト方針の完全な説明については、第 1 章の 7 ページ「コールバック・オブジェクトのオブジェクト方針」を参照してください。
コールバック・ラッパー・オブジェクトおよびそのメソッドの完全な説明については、『BEA Tuxedo CORBA プログラミング・リファレンス』を参照してください。
リスト2-6 は、Chat Room サンプル・アプリケーションでのコールバック・ラッパー・オブジェクトの使用方法を示します。
コード リスト 2-6 Chat Room サンプル・アプリケーションでのコールバック・ラッパー・オブジェクトの使用方法
...
// コールバック・オブジェクトを使用して Listener オブジェクトのサーバントを
// 作成し、Listener オブジェクトを活性化し、Listener オブジェクトに
// 対するオブジェクト・リファレンスを作成する
BEAWrapper::Callbacks* callbacks =
new BEAWrapper::Callbacks( orb_ptr );
Listener_i * listener_callback_servant = new Listener_i();
CORBA::Object_var v_listener_oref=callbacks->start_transient(
listener_callback_servant,
ChatClient::_tc_Listener->id());
ChatClient::Listener_var v_listener_callback_oref =
ChatClient::Listener::_narrow(
var_listener_oref.in());
...
ステップ 6: コールバック・オブジェクトにリファレンスを渡すことによるオブジェクトのオペレーションの呼び出し
コールバック・オブジェクトへのオブジェクト・リファレンスを取得したら、そのコールバック・オブジェクト・リファレンスを BEA Tuxedo オブジェクトのメソッドにパラメータとして渡すことができます。Chat Room サンプル・アプリケーションでは、Moderator オブジェクトは signon メソッドへのパラメータとして、Listener オブジェクトのオブジェクト・リファレンスを使用します。リスト リスト2-7 では、この手順を示します。
コード リスト 2-7 signon メソッドの呼び出し
// ユーザ定義のハンドルと Listener オブジェクト (コールバック・オブジェクト)
// へのリファレンスを使用してチャット・ルームにログインし、ログイン中の
// クライアント・アプリケーションから入力を受信する
var_moderator_reference->signon(handle,
var_listener_callback_oref.in() );
ステップ 7: コンフィギュレーション情報の指定
IIOP を使用するリモート共同クライアント/サーバ・アプリケーションを実行する場合は、次のようにコールバック・オブジェクトのオブジェクト・リファレンスにホストおよびポート番号が含まれている必要があります。
ポート番号の指定は、動的範囲ではなくユーザ範囲から行ってください。ユーザ範囲からポート番号を割り当てることで、共同クライアント/サーバ・アプリケーションで使用するポートの不整合を回避できます。使用する共同クライアント/サーバ・アプリケーション用に特定のポートを指定するには、共同クライアント/サーバ・アプリケーションのためのプロセスを開始するコマンド行に、以下を含めます。
-ORBport nnn
ここで、nnn は共同クライアント/サーバ・アプリケーション内のコールバック・オブジェクトに対する呼び出しを生成およびリッスンする際に ORB によって使用されるポートの数です。
このコマンドは、共同クライアント/サーバ・アプリケーション内のコールバック・オブジェクトのオブジェクト・リファレンスを永続的なものにする場合、および共同クライアント/サーバ・アプリケーションを停止して再起動する場合に使用します。このコマンドを使用しない場合、ORB ではランダムなポートが使用されます。共同クライアント/サーバ・アプリケーションを停止してから再起動すると、その共同クライアント/サーバ・アプリケーション内のコールバック・オブジェクトへの呼び出しは失敗します。
ポート番号は、CORBA::orb_init メンバ関数の argv 引数への入力の一部です。argv 引数が渡されると、ORB がその情報を読み取り、そのプロセス中に作成されるすべてのオブジェクト・リファレンス用のポートを確立します。また、同じ目的にブートストラップ・オブジェクトの register_callback_port オペレーションを使用することもできます。
共同クライアント/サーバ・アプリケーションが同じドメイン内の BEA Tuxedo オブジェクトと通信するには、サーバ・アプリケーションのコンフィギュレーション・ファイルが必要です。このコンフィギュレーション・ファイルは、サーバ・アプリケーション開発の一環として記述します。コンフィギュレーション・ファイルのバイナリ・バージョンである TUXCONFIG ファイルは、共同クライアント/サーバ・アプリケーションを起動する前に存在している必要があります。TUXCONFIG ファイルは、tmloadcf コマンドを使用して作成されます。TUXCONFIG ファイルの作成については、『BEA Tuxedo CORBA アプリケーション入門』および『BEA Tuxedo アプリケーションの設定』を参照してください。
使用する共同クライアント/サーバ・アプリケーションで IIOP バージョン 1.0 または 1.1 が使用されている場合、管理者は IIOP サーバ・ハンドラ (ISH) に接続されていないコールバック・オブジェクトをアウトバウンド IIOP が呼び出すことを可能にする起動パラメータを指定して、IIOP サーバ・リスナ (ISL) をブートする必要があります。ISL コマンドの -O オプションを指定すると、アウトバウンド IIOP が有効になります。パラメータを追加すると、管理者は BEA Tuxedo アプリケーションに最適なコンフィギュレーションを得ることができます。ISL コマンドの詳細については、『BEA Tuxedo コマンド・リファレンス』を参照してください。
ステップ 8: 共同クライアント/サーバ・アプリケーションのコンパイル
共同クライアント/サーバ・アプリケーション開発の最終手順は、実行可能プログラムの生成です。これを行うには、スケルトンおよびクライアント・スタブに対してコードおよびリンクをコンパイルする必要があります。
buildobjclient コマンドを -P オプションを指定して使用し、共同クライアント/サーバ・アプリケーションの実行可能プログラムを生成します。実行可能プログラムをビルドするには、コマンドにより BEA Tuxedo オブジェクトのクライアント・スタブ、コールバック・オブジェクトのクライアント・スタブ、コールバック・オブジェクトのスケルトン、およびコールバック・オブジェクトのインプリメンテーションを、適切な POA ライブラリと組み合わせます。
注記 buildobjclient コマンドの -P オプションを使用するには、コールバック・オブジェクトのスケルトンとクライアント・スタブを作成したときに idl コマンドの -P オプションを使用しておく必要があります。
POA の使用によるコールバック・オブジェクトの作成
POA を直接使用してコールバック・オブジェクトを作成できます。POA を直接使用するのは、コールバック・ラッパー・オブジェクトからでは利用できない POA 機能およびオブジェクト方針を使用する場合です。たとえば、POA の最適化機能を使う場合は、POA を直接使用する必要があります。以下のトピックでは、POA を使用して、サポートされているオブジェクト方針を備えたコールバック・オブジェクトを作成する方法を説明します。
注記 BEA Tuxedo 製品のこのバージョンでサポートされているのは、POA インターフェイスのサブセットのみです。サポートされているインターフェイスのリストについては、『BEA Tuxedo CORBA プログラミング・リファレンス』を参照してください。
一時オブジェクト方針を備えたコールバック・オブジェクトの作成
POA を使用して一時オブジェクト方針を備えたコールバック・オブジェクトを作成するには、以下のことを行うコードを記述する必要があります。
子 POA を作成する必要があるのは、ルート POA では双方向 IIOP を使用できないためです。子 POA では LifespanPolicy (TRANSIENT) および IDAssignmentPolicy (SYSTEM) のデフォルト値を使用できます。BOTH の BiDirPolicy 方針を指定する必要があります。
IIOP バージョン 1.2 は、入力される要求と出力される要求の双方について TCP/IP 接続の再利用をサポートします。TCP/IP 接続の再利用の許可を選択するのは、ORB です。再利用を許可するには、TCP/IP 接続の再利用を許可する ORB 方針オブジェクトを作成し、方針リスト内の方針オブジェクトを ORB 初期化時に使用します。方針オブジェクトは、CORBA::ORB::create_policy オペレーションを使用して作成します。CORBA::ORB::create_policy オペレーションの詳細については、『BEA Tuxedo CORBA プログラミング・リファレンス』を参照してください。
リスト2-8 では、POA を使用して Listener オブジェクトを作成する Chat Room サンプル・アプリケーションの一部を示します。
コード リスト 2-8 POA の使用による Listener オブジェクトの作成
// POA との通信を確立
orb_ptr = CORBA::ORB_init(argc, argv, "BEA_IIOP");
CORBA::PolicyList policy_list(1);
CORBA::Any val;
CORBA::Object_ptr o_init_poa;
o_init_poa = orb_ptr->resolve_initial_references("RootPOA");
// ナロー変換してルート POA を取得
root_poa_ptr = PortableServer::POA::_narrow(o_init_poa);
CORBA::release(o_init_poa);
// POA について双方向の IIOP 方針を指定
val <<= BiDirPolicy::BOTH;
CORBA::Policy_ptr bidir_pol_ptr = orb_ptr->create_policy(
BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE, val);
policy_list.length ( 1 );
policy_list[0] = bidir_pol_ptr;
// 双方向の POA を作成
bidir_poa_ptr = root_poa_ptr->create_POA("BiDirPOA",
root_poa_ptr->
the_POAManager(),
policy_list);
// POA を活性化
root_poa_ptr->the_POAManager()->activate();
// Listener オブジェクトを作成
ChatClient::Listener_var v_listener_callback_ref;
// Listener オブジェクトのサーバントを作成して活性化
listener_callback_servant = new Listener_i();
CORBA::Object_var v_listener_oref;
PortableServer::ObjectId_var temp_OId =
bidir_poa_ptr ->activate_object(listener_callback_servant );
// システム生成のオブジェクト ID を備えた Listener オブジェクトに対する
// オブジェクト・リファレンスを作成
v_listener_oref = bidir_poa_ptr->create_reference_with_id
(temp_OId,
ChatClient::_tc_Listener->id() );
v_listener_callback_ref = ChatClient::Listener::_narrow
( v_listener_oref.in() );
永続/ユーザ ID オブジェクト方針を備えたコールバック・オブジェクトの作成
POA を使用して永続/ユーザ ID オブジェクト方針を備えたコールバック・オブジェクトを作成するには、以下のことを行うコードを記述する必要があります。
注記 永続/ユーザ ID オブジェクト方針は、リモート共同クライアント/サーバ・アプリケーション、つまり BEA Tuxedo ドメイン内には存在しない共同クライアント/サーバ・アプリケーションでのみ使用されます。
リスト2-9 では、これらの手順を行うコードを示します。
注記 このコード例では、双方向 IIOP を使用しません。
コード リスト 2-9 永続/ユーザ ID オブジェクト方針を備えた Listener オブジェクトのコード例
// 文字列を宣言してオブジェクト ID に変換
const char* oid_string = "783";
PortableServer::ObjectID_var oid=
PortableServer::string_to_ObjectId(oid_string);
// ルート POA を見つける
CORBA::Object_var oref =
orb_ptr->resolve_initial_references("RootPOA");
PortableServer::POA_var root_poa =
PortableServer::POA::_narrow(oref);
// 永続/ユーザ ID POA を作成して活性化
CORBA::PolicyList policies(2);
policies.length(2);
policies[0] = root_poa->create_lifespan_policy(
PortableServer::PERSISTENT);
policies[1] = root_poa->create_id_assignment_policy(
PortableServer::USER_ID );
PortableServer::POA_var poa_ref =
root_poa->create_POA("poa_ref",
root_poa->the_POAManager(),policies);
root_poa->the_POAManager()->activate();
// Listener オブジェクトのオブジェクト・リファレンスを作成
oref = poa_ref->create_reference_with_id(oid,
ChatClient::_tc_Listener->id());
ChatClient::Listener_ptr Listener_oref =
ChatClient::Listener::_narrow( oref );
// Listener_i サーバントを作成して、Listener オブジェクトを活性化
Listener_i* my_Listener_i = new Listener_i();
poa_ref->activate_object_with_id( oid, my_Listener_i);
// Listener オブジェクトにリファレンスを渡す呼び出しを行う
v_moderator_ref->signon( handle, Listener_oref);
永続/システム ID オブジェクト方針を備えたコールバック・オブジェクトの作成
POA を使用して永続/システム ID オブジェクト方針を備えたコールバック・オブジェクトを作成するには、次のことを行うコードを記述する必要があります。
注記 永続/システム ID オブジェクト方針は、リモート共同クライアント/サーバ・アプリケーション、つまり BEA Tuxedo ドメイン内には存在しない共同クライアント/サーバ・アプリケーションでのみ使用されます。
リスト2-10 では、これらの手順を行うコードを示します。
コード リスト 2-10 永続/システム ID オブジェクト方針を備えた Listener オブジェクトのコード例
// ルート POA を見つける
CORBA::Object_var oref=
orb_ptr->resolve_initial_references("RootPOA")
PortableServer::POA_var root_poa =
PortableServer::POA::_narrow(oref);
// 永続/システム ID POA を作成して活性化
CORBA::PolicyList policies(1);
policies.length(1);
policies[0] = root_poa->create_lifespan_policy(
PortableServer::PERSISTENT);
//IDAssignmentPolicy はデフォルトのため、指定する必要はない
PortableServer::POA_var poa_ref = root_poa->create_POA(
"poa_ref", root_poa->the_POAManager(), policies);
root_poa->the_POAManager()->activate();
// Listener_i サーバントを作成して、Listener オブジェクトを活性化
Listener_i* my_Listener_i = new Listener_i();
PortableServer::ObjectId_var temp_OId =
poa_ref->activate_object ( my_Listener_i );
// 戻り値のシステム・オブジェクト ID を備えた Listener オブジェクトの
// オブジェクト・リファレンスを作成
oref = poa_ref->create_reference_with_id(
temp_OId, ChatClient::_tc_Listener->id() );
ChatClient::Listener_var Listener_oref =
ChatClient::Listener::_narrow(oref);
// Listener オブジェクトにリファレンスを渡す呼び出しを行う
v_moderator_ref->signon( handle, Listener_oref );
C++ 共同クライアント/サーバ・アプリケーションのスレッドに関する留意事項
共同クライアント/サーバ・アプリケーションは、まずクライアント・アプリケーションとして機能し、次にサーバ・アプリケーションとして機能するように切り替わることができます。そのために、共同クライアント/サーバ・アプリケーションでは、以下の呼び出しを行うことにより、スレッドの完全な制御を ORB に提供します。
orb -> run();
共同クライアント/サーバ・アプリケーションのサーバ部分のメソッドが ORB::shutdown() を呼び出すと、サーバのアクティビティはすべて停止し、共同クライアント/サーバ・アプリケーションのサーバ部分で ORB::run() が呼び出されると、制御はステートメントに返されます。制御が共同クライアント/サーバ・アプリケーションのクライアント機能に返されるのは、この条件においてのみです。
クライアント・アプリケーションにはスレッドが 1 つしかないため、共同クライアント/サーバ・アプリケーションのクライアント機能とサーバ機能で、中央演算処理装置 (CPU) を共有する必要があります。この共有は、ORB をときどき確認して、共同クライアント/サーバ・アプリケーションに、実行すべきサーバ・アプリケーション作業があるかどうかを調べることによって行われます。ORB の確認を実行するには、次のコードを使用します。
if ( orb->work_pending() ) orb->perform_work();
ORB はサーバ・アプリケーションの作業を完了すると、共同クライアント/サーバ・アプリケーションに戻ります。共同クライアント/サーバ・アプリケーションはその後、クライアント・アプリケーション機能を実行します。共同クライアント/サーバ・アプリケーションでは、 ORB の不定期な確認を、確実に行う必要があります。行われない場合、共同クライアント/サーバ・アプリケーションは呼び出しをまったく処理しません。
共同クライアント/サーバ・アプリケーションが要求をブロックしている間は、ORB がコールバックを扱うことはできません。共同クライアント/サーバ・アプリケーションが別の BEA Tuxedo サーバ・アプリケーションのオブジェクトを呼び出した場合、ORB は応答待機中にブロックします。ブロック中の ORB はコールバックを扱うことができないため、要求が完了するまでコールバックはキュー入れられます。
Chat Room サンプル・アプリケーションのビルドと実行
Chat Room サンプル・アプリケーションをビルドして実行するには、以下の手順に従います。
以降の節では、上記の各手順について説明します。
Chat Room サンプル・アプリケーション用ファイルの作業ディレクトリへのコピー
Chat Room サンプル・アプリケーションのファイルを、ローカル・マシンの作業ディレクトリにコピーする必要があります。Chat Room サンプル・アプリケーションのファイルは、次のディレクトリに格納されています。
Windows
drive:¥TUXDIR¥samples¥corba¥chatroom
UNIX
/usr/local/TUXDIR/samples/corba/chatroom
Chat Room サンプル・アプリケーションをビルドして実行するには、表 2-4 に示すファイルを使用します。
Chat Room サンプル・アプリケーションのファイルに対する保護属性の変更 BEA Tuxedo ソフトウェアのインストール中、サンプル・アプリケーション・ファイルは読み取り専用としてマークされます。Chat Room サンプル・アプリケーションのファイルを編集またはビルドするには、作業ディレクトリにコピーしたファイルの保護属性を次のように変更しておく必要があります。 Windows prompt> attrib /S -r drive:¥workdirectory¥*.* UNIX prompt> /bin/ksh ksh prompt> chmod u+w /workdirectory/*.* UNIX オペレーティング・システムのプラットフォームでは、次のように ChatRoom.ksh のパーミッションも変更して、ファイルの実行許可を付与する必要があります。 ksh prompt> chmod +x ChatRoom.ksh TUXDIR 環境変数の設定の確認 Chat Room サンプル・アプリケーションをビルドして実行する前に、システムで TUXDIR 環境変数が設定されていることを確認する必要があります。ほとんどの場合、この環境変数はインストール手順の一環として設定済みです。TUXDIR 環境変数は、BEA Tuxedo ソフトウェアをインストールしたディレクトリ・パスを定義します。たとえば、次のように入力します。 Windows TUXDIR=C:¥TUXDIR UNIX TUXDIR=/usr/local/TUXDIR インストール中に定義された環境変数の情報が正しいことを確認するには、以下の手順に従います。 Windows
UNIX
ksh prompt>printenv TUXDIR
設定を変更するには、以下の手順に従います。
Windows
UNIX
ksh prompt>export TUXDIR=directorypath
ChatSetup コマンドの実行
ChatSetup コマンドを使用すると、以下の手順を自動化できます。
ChatSetup コマンドを実行する前に、次のことを確認する必要があります。
サンプル・アプリケーションをビルドして実行するには、次のように ChatSetup コマンドを入力します。
Windows
prompt>cd workdirectory
prompt> ChatSetup.cmd
UNIX
ksh prompt> cd workdirectory
ksh prompt> ./ChatSetup.ksh
サーバ・アプリケーションの起動
次のコマンドを入力して、Chat Room サンプル・アプリケーションにおけるサーバ・アプリケーションとシステム・サーバのプロセスを開始します。
prompt> tmboot -y
このコマンドを入力すると、次のサーバ・プロセスが開始されます。
システムの EventBroker です。このサーバ・プロセスを使用するのは、BEA Tuxedo システムのみです。
次の 3 つの TMFFNAME サーバ・プロセスが開始されます。
Chat Room サンプル・アプリケーションのためのサーバ・アプリケーション・プロセスです。
IIOP リスナ/ハンドラ・プロセス。
クライアント・アプリケーションの起動
次のコマンドを入力して、Chat Room サンプル・アプリケーションのクライアント・アプリケーションを起動します。
prompt> ChatClient chatroom_name -ORBport nnn
ここで、chatroom_name は接続するチャット・ルームの名前です。任意の値を入力できます。自分自身を識別するためのハンドルを入力するよう求められます。任意の値を入力できます。選択したハンドルが使用中の場合は、別のハンドルの入力を求められます。
Chat Room サンプル・アプリケーションを使いやすいように最適化するには、同じチャット・ルーム名を使用する第 2 のクライアント・アプリケーションを実行します。
クライアント・アプリケーションを終了するには、「¥」と入力します。
Chat Room サンプル・アプリケーションの停止
別のサンプル・アプリケーションを使用する前に、次のコマンドを入力して Chat Room サンプル・アプリケーションを停止し、作業ディレクトリから不要なファイルを削除します。
Windows
prompt> tmshutdown -y
prompt> Admin¥setenv
prompt> nmake -f ChatRoom.nt superclean
prompt> nmake -f ChatRoom.nt adminclean
UNIX
ksh prompt> tmshutdown -y
ksh prompt> . ./Admin/setenv.ksh
ksh prompt> make -f ChatRoom.mk superclean
ksh prompt> make -f ChatRoom.nt adminclean
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |