表2-1では、C++共同クライアント/サーバー・アプリケーションの開発プロセスの概略を示します。
共同クライアント/サーバー・アプリケーション内のコールバック・オブジェクトはトランザクションに関与せず、オブジェクト管理機能を持たないため、このオブジェクト用の実装構成ファイル(filename
.icf
)を作成する必要はありません。ただし、Oracle Tuxedoアプリケーション内のOracle TuxedoオブジェクトのICFファイルは作成する必要があります。ICFファイルの記述については、『CORBAサーバー・アプリケーションの作成』を参照してください。
ここでは、Chat Roomサンプル・アプリケーションを使用して開発の手順を説明します。チャット・ルームとは、様々な場所にいる人々が相互に通信できるアプリケーションです。ログインしたクライアント・アプリケーションを追跡し、それらにメッセージを配信する役目を持つモデレータが、チャット・ルームであると考えてください。
クライアント・アプリケーションは、ユーザー名を指定してモデレータにログインします。キーボードにメッセージが入力されると、クライアント・アプリケーションはモデレータを呼び出してそのメッセージを渡します。次に、モデレータはコールバック・オブジェクトを呼び出して、ほかのすべてのクライアント・アプリケーションにメッセージを配信します。
Chat Roomサンプル・アプリケーションは、C++共同クライアント/サーバー・アプリケーションおよびOracle Tuxedoサーバー・アプリケーションで構成されています。共同クライアント/サーバー・アプリケーションはキーボード入力を受け取り、モデレータに対して呼出しを行います。また共同クライアント/サーバー・アプリケーションは、モデレータからのメッセージをリスニングする、つまりモデレータからの呼出しを受信するように、コールバック・オブジェクトを設定します。Chat Roomサンプル・アプリケーションのOracle Tuxedoサーバー・アプリケーションでは、モデレータが実装されます。
図2-1では、Chat Roomサンプル・アプリケーションがどのように動作するのかを示します。
Chat Roomサンプル・アプリケーションは、次のように動作します。
signon
オペレーションの一部としてModeratorオブジェクトに渡します。send
オペレーションを介してそのメッセージをModeratorオブジェクトに送信します。post
呼出しを受け取れるようにします。 Chat Roomサンプル・アプリケーションのソース・ファイルは、Oracle Tuxedoソフトウェア・ディレクトリのTUXDIR\
samples\corba\chatroom
ディレクトリに格納されています。詳細は、「Chat Roomサンプル・アプリケーションのビルドと実行」を参照してください。
使用できるCORBAインタフェースをクライアント・アプリケーションに記述するには、Object Management Group (OMG)インタフェース定義言語(IDL)を使用します。OMG IDLで記述したインタフェース定義を使用すると、完全にCORBAインタフェースを定義し、各オペレーションの引数を指定できます。OMG IDLは、純粋な宣言型言語です。つまり、実装の詳細は含まれていません。OMG IDLの詳細は、『CORBAクライアント・アプリケーションの作成』を参照してください。
Chat Roomサンプル・アプリケーションでは、表2-2に示したCORBAインタフェースが実装されます。
例2-1は、Listener
インタフェースを定義するchatclient.idl
を示します。
module ChatClient{
interface Listener {
oneway void post (in string from,
in string output_line);
};
};
例2-2は、Chat Roomサンプル・アプリケーションのModerator
およびModeratorFactory
インタフェースを定義するchatroom.idl
を示します。別のOMG IDLファイルのインタフェースに対する参照を解決するには、#include
を使用します。Chat Roomサンプル・アプリケーションでは、signon
メソッドにはパラメータとしてListenerオブジェクトが必要であり、そのIDLファイルはListenerインタフェースを定義するOMG IDLファイルを#include
している必要があります。
#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 );
};
};
OMG IDLで定義したインタフェース仕様は、IDLコンパイラによってスケルトンおよびクライアント・スタブの生成に使用されます。共同クライアント/サーバー・アプリケーションは、Oracle Tuxedoオブジェクトにクライアント・スタブを、コールバック・オブジェクトにスケルトンおよびクライアント・スタブを使用することに注意してください。
たとえばChat Roomサンプル・アプリケーションでは、共同クライアント/サーバー・アプリケーションはListenerオブジェクト(つまりコールバック・オブジェクト)のためのスケルトンおよびクライアント・スタブを使用して、オブジェクトを実装します。また、共同クライアント/サーバー・アプリケーションはModerator
およびModeratorFactory
インタフェースのためのクライアント・スタブを使用して、オブジェクトのオペレーションを呼び出します。Oracle Tuxedoサーバー・アプリケーションはModeratorおよびModeratorFactoryオブジェクトのスケルトンを使用してオブジェクトを実装し、Listenerオブジェクトのためのクライアント・スタブを使用してオブジェクトのオペレーションを呼び出します。
開発プロセスでは、idl
コマンドを-P
および-i
の各オプションを指定して使用し、コールバック・オブジェクトを定義するOMG IDLファイルをコンパイルします。たとえばChat Roomサンプル・アプリケーションでは、chatclient.idl
ファイルがOMG IDLファイルです。各オプションは、次のように動作します。
-P
オプションを指定すると、PortableServer::ServantBase
クラスから直接継承したスケルトン・クラスが作成されます。PortableServer::ServantBase
からの継承は、共同クライアント/サーバー・アプリケーションが明示的にコールバック・オブジェクトのサーバントを作成し、そのサーバントの状態を初期化する必要があることを意味しています。activate_object
およびdeactivate_object
メソッドはPortableServer::ServantBase
クラスのメンバーであるため、コールバック・オブジェクトのサーバントでは使用できません。-i
オプションを指定すると、実装テンプレート・ファイルが生成されます。このファイルは、ListenerオブジェクトのOMG IDLで定義されたインタフェースを実装するコードのテンプレートです。 次に、Oracle Tuxedoサーバー・アプリケーションのインタフェースを定義するOMG IDLファイルをコンパイルする必要があります(たとえば、Chat Roomサンプル・アプリケーションのchatroom.idl
ファイル)。このOMG IDLファイルをコンパイルするには、idl
コマンドを-i
オプションのみ指定して使用します。
表3-3に、idl
コマンドによって作成されるファイルの一覧を示します。
注: | Chat Roomサンプル・アプリケーションでは、ChatClient.idl およびChatRoom.idl の各ファイル用に生成されたテンプレート・ファイルは、それらによって実装されるオブジェクト(ListenerおよびModerator)を反映するよう名前を変更されています。また、Moderatorオブジェクト用のテンプレート・ファイルには、ModeratorFactoryオブジェクトの実装が含まれています。 |
各OMG IDLファイルをコンパイルしたら、各オブジェクトのオペレーションを実装するメソッドを記述する必要があります。共同クライアント/サーバー・アプリケーションでは、コールバック・オブジェクト(つまりListenerオブジェクト)の実装ファイルを記述します。コールバック・オブジェクトの実装は、ほかのCORBAオブジェクトの実装と同じように記述しますが、TPフレームワークのかわりにPOAを使用する点が異なります。また、Oracle Tuxedoサーバー・アプリケーションのOracle Tuxedoオブジェクト(ModeratorおよびModeratorFactoryオブジェクト)の実装ファイルも記述します。
例2-3はListenerオブジェクトの実装ファイルを、例2-4はModeratorおよびModeratorFactoryオブジェクトの実装ファイルを示します。
注: | ModeratorおよびModeratorFactoryオブジェクトの実装ファイルには、メソッドとデータがさらに追加されています。実装ファイルのテンプレートは、idl -i コマンドによって作成されています。 |
// This module contains the definition of the implementation class
// 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
// This module contains the definitions of the implementation class
// Moderator and ModeratorFactory
#ifndef _Moderator_i_h
#define _Moderator_i_h
#include "ChatRoom_s.h"
const int CHATTER_LIMIT = 5;
// the most chatters allowed
class Moderator_i : public POA_ChatRoom::Moderator {
public:
//Define the operations
void signon ( const char* who,
ChatClient::Listener_ptr callback_ref);
void send ( const char * who,
const char * input_line);
void signoff ( const char * who);
//Define the Framework functions
virtual void activate_object ( const char* stroid );
virtual void deactivate_object( const char* stroid,
TobjS::DeactivateReasonValue
reason);
private:
// Define function to find name on list
int find( const char * handle );
// Define name of the chat room overseen by the Moderator
char* m_chatroom_name;
// Data for maintaining list
// Chatter[n] id
CORBA::String chatters[CHATTER_LIMIT];
// Chatter[n] callback ref
ChatClient::Listener_var callbacks[CHATTER_LIMIT];
};
class ModeratorFactory_i : public POA_ChatRoom::ModeratorFactory {
public:
ChatRoom::Moderator_ptr get_moderator ( const char*
chatroom_name );
};
#endif
共同クライアント/サーバー・アプリケーションの開発では、そのクライアント部分をOracle Tuxedoクライアント・アプリケーションと同じように記述します。クライアント・アプリケーションには、次の処理を行うコードを含める必要があります。
注: | Oracle Tuxedo製品のうち、CORBA環境のリリース8.0には、Oracle WebLogic Enterpriseの旧リリースで提供されていたOracleクライアント環境オブジェクトが引き続き含まれており、Oracle Tuxedo 8.0 CORBAクライアントでも使用できます。Oracle Tuxedo 8.0クライアントは、これらの環境オブジェクトを使用して、ブートストラップ処理、セキュリティ、およびトランザクション・オブジェクトへの初期参照を解決する必要があります。このリリースでは、OMG Interoperable Naming Service (INS)を使用してブートストラップ処理、セキュリティ、およびトランザクション・オブジェクトへの初期参照を解決するためのサポートが追加されています。INSの詳細は、『CORBAプログラミング・リファレンス』の「CORBAブートストラップ処理のプログラミング・リファレンス」を参照してください。 |
クライアントの開発手順は、リスト2-5で説明します。これは、Chat Roomサンプル・アプリケーションのコードの一部です。Chat Roomサンプル・アプリケーションでは、共同クライアント/サーバー・アプリケーションのクライアント部分がファクトリを使用してModeratorオブジェクトへのオブジェクト・リファレンスを取得し、次にModeratorオブジェクトのsignon
、send
およびsignoff
メソッドを呼び出します。
...
// Initialize the ORB
orb_ptr = CORBA::ORB_init(argc, argv, "BEA_IIOP");
// Create a Bootstrap object to establish communication with the
// domain
bootstrap = new Tobj_Bootstrap(orb_ptr,"");
// Get a FactoryFinder object, use it to find a Moderator factory,
// and get a Moderator.
// Use the Bootstrap object to find the FactoryFinder object
CORBA::Object_var var_factory_finder_oref =
bootstrap->resolve_initial_references("FactoryFinder");
// Narrow the FactoryFinder object
Tobj::FactoryFinder_var var_factory_finder =
Tobj::FactoryFinder::_narrow(var_factory_finder_oref.in());
// Use the FactoryFinder object to find a factory for the Moderator
CORBA::Object_var var_moderator_factory_oref =
var_factory_finder->find_one_factory_by_id(
"ModeratorFactory" );
// Narrow the Moderator Factory
ChatRoom::ModeratorFactory_var var_moderator_factory =
ChatRoom::ModeratorFactory::_narrow(
var_moderator_factory_oref.in() );
// Get a Moderator
// The chatroom name is passed as a command line parameter
var_moderator_oref =
var_moderator_factory->get_moderator
(var_chat_room_name.in() );
...
コールバック・オブジェクトの基本的な作成手順は常に同じであるため、Oracle Tuxedo製品ではコールバック・オブジェクトの開発を簡略化するコールバック・ラッパー・オブジェクトを提供しています。
コールバック・ラッパー・オブジェクトは、次のことを行います。
(_transient)
(_persistent/systemid)
(_persistent/userid)
コールバック・オブジェクトに対するオブジェクト・ポリシーの完全な説明については、「コールバック・オブジェクトのオブジェクト・ポリシー」を参照してください。
コールバック・ラッパー・オブジェクトおよびそのメソッドの完全な説明については、『CORBAプログラミング・リファレンス』を参照してください。
例2-6では、Chat Roomサンプル・アプリケーションでのコールバック・ラッパー・オブジェクトの使用方法を示します。
...
// Use the Callbacks object to create a servant for the
// Listener object, activate the Listener object, and create an
// object reference for the Listener object.
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());
...
コールバック・オブジェクトのオブジェクト参照を取得したら、そのコールバック・オブジェクト参照をOracle Tuxedoオブジェクトのメソッドにパラメータとして渡すことができます。Chat Roomサンプル・アプリケーションでは、Moderatorオブジェクトはsignon
メソッドへのパラメータとして、Listenerオブジェクトのオブジェクト参照を使用します。例2-7では、この手順を示します。
// Sign on to the Chat room using a user-defined handle and a
// reference to the Listener object (the callback object) to receive
// input from other client applications logged into the Chat room.
var_moderator_reference->signon(handle,
var_listener_callback_oref.in() );
IIOPを使用するリモート共同クライアント/サーバー・アプリケーションを実行する場合は、次のようにコールバック・オブジェクトのオブジェクト参照にホストおよびポート番号が含まれている必要があります。
ポート番号の指定は、動的範囲ではなくユーザー範囲から行ってください。ユーザー範囲からポート番号を割り当てることで、共同クライアント/サーバー・アプリケーションで使用するポートの不整合を回避できます。使用する共同クライアント/サーバー・アプリケーション用に特定のポートを指定するには、共同クライアント/サーバー・アプリケーションのためのプロセスを開始するコマンド行に、次を含めます。
ここで、nnn
は共同クライアント/サーバー・アプリケーション内のコールバック・オブジェクトに対する呼出しを生成およびリスニングする際にORBによって使用されるポートの数です。
このコマンドは、共同クライアント/サーバー・アプリケーション内のコールバック・オブジェクトのオブジェクト参照を永続的なものにする場合、および共同クライアント/サーバー・アプリケーションを停止して再起動する場合に使用します。このコマンドを使用しない場合、ORBではランダムなポートが使用されます。共同クライアント/サーバー・アプリケーションを停止してから再起動すると、その共同クライアント/サーバー・アプリケーション内のコールバック・オブジェクトへの呼出しは失敗します。
ポート番号は、CORBA::orb_init
メンバー関数のargv
引数への入力の一部です。argv
引数が渡されると、ORBがその情報を読み取り、そのプロセス中に作成されるすべてのオブジェクト参照用のポートを確立します。また、同じ目的にブートストラップ・オブジェクトのregister_callback_port
オペレーションを使用することもできます。
共同クライアント/サーバー・アプリケーションが同じドメイン内のOracle Tuxedoオブジェクトと通信するには、サーバー・アプリケーションの構成ファイルが必要です。この構成ファイルは、サーバー・アプリケーション開発の一環として記述します。構成ファイルのバイナリ・バージョンであるTUXCONFIG
ファイルは、共同クライアント/サーバー・アプリケーションを起動する前に存在している必要があります。TUXCONFIG
ファイルは、tmloadcf
コマンドを使用して作成されます。TUXCONFIG
ファイルの作成については、『Oracle Tuxedo CORBAアプリケーション・スタート・ガイド』および『Oracle Tuxedoアプリケーションの設定』を参照してください。
使用する共同クライアント/サーバー・アプリケーションでIIOPバージョン1.0または1.1が使用されている場合、管理者はIIOPサーバー・ハンドラ(ISH)に接続されていないコールバック・オブジェクトをアウトバウンドIIOPが呼び出すことを可能にする起動パラメータを指定して、IIOPサーバー・リスナー(ISL)をブートする必要があります。ISLコマンドの-O
オプションを指定すると、アウトバウンドIIOPが有効になります。パラメータを追加すると、管理者はOracle Tuxedoアプリケーションに最適な構成を得ることができます。ISLコマンドの詳細は、『Oracle Tuxedoコマンド・リファレンス』を参照してください。
共同クライアント/サーバー・アプリケーション開発の最終手順は、実行可能プログラムの生成です。これを行うには、スケルトンおよびクライアント・スタブに対してコードおよびリンクをコンパイルする必要があります。
buildobjclient
コマンドを-P
オプションを指定して使用し、共同クライアント/サーバー・アプリケーションの実行可能プログラムを生成します。実行可能プログラムをビルドするには、コマンドによりOracle Tuxedoオブジェクトのクライアント・スタブ、コールバック・オブジェクトのクライアント・スタブ、コールバック・オブジェクトのスケルトン、およびコールバック・オブジェクトの実装を、適切なPOAライブラリと組み合せます。
注: | buildobjclient コマンドの-P オプションを使用するには、コールバック・オブジェクトのスケルトンとクライアント・スタブを作成したときにidl コマンドの-P オプションを使用しておく必要があります。 |
POAを直接使用してコールバック・オブジェクトを作成できます。POAを直接使用するのは、コールバック・ラッパー・オブジェクトからでは利用できないPOA機能およびオブジェクト・ポリシーを使用する場合です。たとえば、POAの最適化機能を使う場合は、POAを直接使用する必要があります。次のトピックでは、POAを使用して、サポートされているオブジェクト・ポリシーを備えたコールバック・オブジェクトを作成する方法を説明します。
注: | Oracle Tuxedo製品のこのバージョンでサポートされているのは、POAインタフェースのサブセットのみです。サポートされているインタフェースのリストについては、『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
オペレーションの詳細は、『CORBAプログラミング・リファレンス』を参照してください。
この手順では、共同クライアント/サーバー・アプリケーションが、オブジェクトIDを使用してPOAのコールバック・オブジェクトをアクティブ化します。
例2-8では、POAを使用してListenerオブジェクトを作成するChat Roomサンプル・アプリケーションの一部を示します。
// Establish communication with the 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");
// Narrow to get the Root POA
root_poa_ptr = PortableServer::POA::_narrow(o_init_poa);
CORBA::release(o_init_poa);
// Specify an IIOP Policy of Bidirectional for the POA
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;
// Create the BiDirectional POA
bidir_poa_ptr = root_poa_ptr->create_POA("BiDirPOA",
root_poa_ptr->
the_POAManager(),
policy_list);
// Activate the POA
root_poa_ptr->the_POAManager()->activate();
// Create the Listener object
ChatClient::Listener_var v_listener_callback_ref;
// Create a servant for Listener object and activate it
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 );
// Create object reference for the Listener object with a
// system generated Object Id
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() );
POAを使用して永続/ユーザーIDオブジェクト・ポリシーを備えたコールバック・オブジェクトを作成するには、次のことを行うコードを記述する必要があります。
注: | 永続/ユーザーIDオブジェクト・ポリシーは、リモート共同クライアント/サーバー・アプリケーション、つまりOracle Tuxedoドメイン内には存在しない共同クライアント/サーバー・アプリケーションでのみ使用されます。 |
例2-9では、これらの手順を行うコードを示します。
注: | このサンプル・コードでは、双方向IIOPを使用しません。 |
// Declare a string and convert it to an object Id.
const char* oid_string = "783";
PortableServer::ObjectID_var oid=
PortableServer::string_to_ObjectId(oid_string);
// Find the root POA
CORBA::Object_var oref =
orb_ptr->resolve_initial_references("RootPOA");
PortableServer::POA_var root_poa =
PortableServer::POA::_narrow(oref);
// Create and activate a Persistent/UserID 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();
// Create object reference for the Listener object.
oref = poa_ref->create_reference_with_id(oid,
ChatClient::_tc_Listener->id());
ChatClient::Listener_ptr Listener_oref =
ChatClient::Listener::_narrow( oref );
// Create Listener_i servant and activate the Listener object
Listener_i* my_Listener_i = new Listener_i();
poa_ref->activate_object_with_id( oid, my_Listener_i);
// Make call passing the reference to the Listener object
v_moderator_ref->signon( handle, Listener_oref);
POAを使用して永続/システムIDオブジェクト・ポリシーを備えたコールバック・オブジェクトを作成するには、次のことを行うコードを記述する必要があります。
注: | 永続/システムIDオブジェクト・ポリシーは、リモート共同クライアント/サーバー・アプリケーション、つまりOracle Tuxedoドメイン内には存在しない共同クライアント/サーバー・アプリケーションでのみ使用されます。 |
例2-10では、これらの手順を行うコードを示します。
// Find the root POA
CORBA::Object_var oref=
orb_ptr->resolve_initial_references("RootPOA")
PortableServer::POA_var root_poa =
PortableServer::POA::_narrow(oref);
// Create and activate a Persistent/System ID POA
CORBA::PolicyList policies(1);
policies.length(1);
policies[0] = root_poa->create_lifespan_policy(
PortableServer::PERSISTENT);
//IDAssignmentPolicy
is the default so you do not need to specify it
PortableServer::POA_var poa_ref = root_poa->create_POA(
"poa_ref", root_poa->the_POAManager(), policies);
root_poa->the_POAManager()->activate();
// Create Listener_i servant and activate the Listener object
Listener_i* my_Listener_i = new Listener_i();
PortableServer::ObjectId_var temp_OId =
poa_ref->activate_object ( my_Listener_i );
// Create object reference for Listener object with returned
// system object Id
oref = poa_ref->create_reference_with_id(
temp_OId, ChatClient::_tc_Listener->id() );
ChatClient::Listener_var Listener_oref =
ChatClient::Listener::_narrow(oref);
// Make the call passing the reference to the Listener object
v_moderator_ref->signon( handle, Listener_oref );
共同クライアント/サーバー・アプリケーションは、まずクライアント・アプリケーションとして機能し、次にサーバー・アプリケーションとして機能するように切り替わることができます。そのために、共同クライアント/サーバー・アプリケーションでは、次の呼出しを行うことにより、スレッドの完全な制御をORBに提供します。
共同クライアント/サーバー・アプリケーションのサーバー部分のメソッドがORB::shutdown()
を呼び出すと、サーバーのアクティビティはすべて停止し、共同クライアント/サーバー・アプリケーションのサーバー部分でORB::run()
が呼び出されると、制御はステートメントに返されます。制御が共同クライアント/サーバー・アプリケーションのクライアント機能に返されるのは、この条件においてのみです。
クライアント・アプリケーションにはスレッドが1つしかないため、共同クライアント/サーバー・アプリケーションのクライアント機能とサーバー機能で、中央演算処理装置(CPU)を共有する必要があります。この共有は、ORBをときどき確認して、共同クライアント/サーバー・アプリケーションに、実行すべきサーバー・アプリケーション作業があるかどうかを調べることによって行われます。ORBの確認を実行するには、次のコードを使用します。
if ( orb->work_pending() ) orb->perform_work();
ORBはサーバー・アプリケーションの作業を完了すると、共同クライアント/サーバー・アプリケーションに戻ります。共同クライアント/サーバー・アプリケーションはその後、クライアント・アプリケーション機能を実行します。共同クライアント/サーバー・アプリケーションでは、ORBの不定期な確認を、確実に行う必要があります。行われない場合、共同クライアント/サーバー・アプリケーションは呼出しをまったく処理しません。
共同クライアント/サーバー・アプリケーションがリクエストをブロックしている間は、ORBがコールバックを扱うことはできません。共同クライアント/サーバー・アプリケーションが別のOracle Tuxedoサーバー・アプリケーションのオブジェクトを呼び出した場合、ORBはレスポンス待機中にブロックします。ブロック中のORBはコールバックを扱うことができないため、リクエストが完了するまでコールバックはキュー入れられます。
Chat Roomサンプル・アプリケーションをビルドして実行するには、次の手順に従います。
Chat Roomサンプル・アプリケーションのファイルを、ローカル・マシンの作業ディレクトリにコピーする必要があります。Chat Roomサンプル・アプリケーションのファイルは、次のディレクトリに格納されています。
drive
:
\TUXDIR
\samples\corba\chatroom
/usr/local/TUXDIR
/samples/corba/chatroom
Chat Roomサンプル・アプリケーションをビルドして実行するには、表2-4に示すファイルを使用します。
Oracle Tuxedoソフトウェアのインストール時には、サンプル・アプリケーションは読取り専用に設定されています。Chat Roomサンプル・アプリケーションのファイルを編集またはビルドするには、作業ディレクトリにコピーしたファイルの保護属性を次のように変更しておく必要があります。
prompt> attrib /S -r
drive
:
\workdirectory
\*.*
ksh prompt> chmod u+w /
workdirectory
/*.*
UNIXオペレーティング・システムのプラットフォームでは、次のようにChatRoom.ksh
のパーミッションも変更して、ファイルの実行許可を付与する必要があります。
ksh prompt> chmod +x ChatRoom.ksh
Chat Roomサンプル・アプリケーションをビルドして実行する前に、システムでTUXDIR
環境変数が設定されていることを確認する必要があります。ほとんどの場合、この環境変数はインストール手順の一環として設定済です。TUXDIR
環境変数は、Oracle Tuxedoソフトウェアをインストールしたディレクトリ・パスを定義します。例:
インストール中に定義された環境変数の情報が正しいことを確認するには、次の手順に従います。
ksh prompt>export TUXDIR=
directorypath
ChatSetup
コマンドを使用すると、次の手順を自動化できます。
ChatSetup
コマンドを実行する前に、次のことを確認する必要があります。
サンプル・アプリケーションをビルドして実行するには、次のようにChatSetup
コマンドを入力します。
次のコマンドを入力して、Chat Roomサンプル・アプリケーションにおけるサーバー・アプリケーションとシステム・サーバーのプロセスを開始します。
このコマンドを入力すると、次のサーバー・プロセスが開始されます。
次のコマンドを入力して、Chat Roomサンプル・アプリケーションのクライアント・アプリケーションを起動します。
prompt> ChatClient
chatroom_name -ORBport nnn
ここで、chatroom_nameは接続するチャット・ルームの名前です。任意の値を入力できます。自分自身を識別するためのハンドルを入力するよう求められます。任意の値を入力できます。選択したハンドルが使用中の場合は、別のハンドルの入力を求められます。
Chat Roomサンプル・アプリケーションを使いやすいように最適化するには、同じチャット・ルーム名を使用する第2のクライアント・アプリケーションを実行します。
クライアント・アプリケーションを終了するには、「\」
と入力します。
別のサンプル・アプリケーションを使用する前に、次のコマンドを入力してChat Roomサンプル・アプリケーションを停止し、作業ディレクトリから不要なファイルを削除します。
prompt> nmake -f ChatRoom.nt superclean
prompt> nmake -f ChatRoom.nt adminclean
ksh prompt> . ./Admin/setenv.ksh
ksh prompt> make -f ChatRoom.mk superclean
ksh prompt> make -f ChatRoom.nt adminclean