![]() ![]() ![]() ![]() |
CORBA プログラミングの説明を有意義にするには、まず、CORBA とは何なのかということと、Oracle Tuxedo の情報で使われるオブジェクト用語を理解しておく必要があります。
オブジェクトの定義は、アーキテクチャやプログラミング言語によってさまざまです。たとえば C++ オブジェクトの概念は、CORBA オブジェクトの概念とは少し異なります。また、Component Object Model (COM) オブジェクトの概念も CORBA オブジェクトの概念とはかなり異なります。
最も重要なことは、この章の CORBA オブジェクトの概念が Object Management Group (OMG) によって提示されている定義と一致しているということです。OMG からは、オブジェクトの仕様やオブジェクトの細部を規定するほかの文書が多く発行されています。
CORBA オブジェクトは、単独では存在し得ないという意味において仮想のエンティティですが、その CORBA オブジェクトの参照を利用し、クライアント アプリケーションによってそのオブジェクトのオペレーションが要求された時点で実体化されます。CORBA オブジェクトの参照は、オブジェクト参照と呼ばれます。オブジェクト参照は、Oracle Tuxedo システムで CORBA オブジェクトを指定し操作できるようにする唯一の手段です。オブジェクト参照の詳細については、Oracle Tuxedo オンライン マニュアルの『Tuxedo CORBA サーバ アプリケーションの開発方法』を参照してください。
クライアント アプリケーションまたはサーバ アプリケーションによってオブジェクト参照を使用してオブジェクトに対する要求が発行されると、そのオブジェクトがまだメモリでアクティブになっていない場合は、Oracle Tuxedo サーバ アプリケーションでオブジェクト参照で指定されたオブジェクトのインスタンス化が行われます (要求は常にオブジェクトの特定のオペレーション呼び出しにマッピングされる)。
通常、オブジェクトをインスタンス化する過程では、サーバ アプリケーションによってオブジェクトの状態が初期化されます。その際、オブジェクトの状態はデータベースなどの永続ストレージから読み込まれる場合もあります。
オブジェクトには、以下のために必要なすべてのデータが格納されます。
CORBA オブジェクトを構成するデータは、データベースのレコードをベースとする場合があります。そのデータベースのレコードは、永続的なオブジェクトの状態です。このレコードは、次のように操作が行われたときに Oracle Tuxedo ドメインの CORBA オブジェクトからアクセスできるようになります。
Server::create_servant
メソッド (Server オブジェクトにある) を呼び出すことによってインスタンス化されます。 activate_object
オペレーションが呼び出されます。その結果、状態を格納しているレコードがメモリに読み込まれます。
言語オブジェクトはアプリケーションの実行の境界内にのみ存在しますが、CORBA オブジェクトはプロセスやマシン システムをまたがって存在できます。Oracle Tuxedo システムには、オブジェクトを作成し、そのオブジェクトをアプリケーションからアクセス可能にするためのメカニズムがあります。
Oracle Tuxedo CORBA サーバ アプリケーションのプログラマは、オブジェクトの状態を初期化するコードとオブジェクトがアクティブでなくなったときにそのオブジェクトの状態を処理するコードを記述する必要があります。オブジェクトのデータが永続ストレージにある場合、このコードには永続ストレージのデータを読み書きするオペレーションが含まれます。サーバ アプリケーション開発の詳細については、Oracle Tuxedo オンライン マニュアルの『Tuxedo CORBA サーバ アプリケーションの開発方法』を参照してください。
通常の CORBA オブジェクトの構成要素は次のとおりです (図も参照)。
オブジェクト ID (OID) は、オブジェクトとその状態 (データベース レコードなど) を関連付け、オブジェクトのインスタンスを識別します。ファクトリでオブジェクト参照が作成されると、そのオブジェクト参照の要求でファクトリに渡されるパラメータに基づいた OID が割り当てられます。
注意 : | サーバ アプリケーションのプログラマは、Oracle Tuxedo クライアント/サーバ アプリケーションで使用されるファクトリを作成する必要があります。プログラマは、OID を割り当てるコードを記述しなければなりません。ファクトリの説明およびファクトリ作成の例については、『Tuxedo CORBA サーバ アプリケーションの開発方法』を参照してください。 |
Oracle Tuxedo システムでは、次の情報を利用してオブジェクトをインスタンス化する方法を指定できます。
オブジェクトのインタフェース (アプリケーションの OMG IDL ファイルで記述) は、データおよびオブジェクトに対して実行できるオペレーションを識別します。たとえば、University 窓口オブジェクトのインタフェースでは次のものが識別されます。
CORBA オブジェクトの特性の 1 つは、インタフェースの定義が実行時にそのデータとオペレーションから切り離されることです。CORBA システムでは、CORBA オブジェクトのインタフェース定義をインタフェース リポジトリというコンポーネントに配置できます。データとオペレーションはインタフェース定義によって指定されますが、オブジェクトがアクティブになったときにそれらはサーバ アプリケーションのプロセスに存在します。
オブジェクトのデータには、オブジェクト クラスまたはオブジェクト インスタンスに固有の情報がすべて含まれます。たとえば、University アプリケーションのコンテキストの典型的なオブジェクトに窓口があります。窓口のデータとしては次のものが考えられます。
オブジェクトのデータは、属性を使用してアクセス可能な構造体に結合したりすることで効率的にカプセル化できます。属性は、オブジェクトのデータをオペレーションから切り離す典型的な手段です。
オブジェクトのオペレーションは、オブジェクトのデータを使用して処理を実行できるルーチンのセットです。たとえば、窓口オブジェクトを使用して機能を実行するオペレーションとしては次のものが考えられます。
CORBA システムで、オブジェクトのオペレーションとして記述するコードはオブジェクト実装 (次節参照) と呼ばれることがあります。
前節で説明したように、CORBA オブジェクトを構成するデータはデータベースのレコードに格納されている場合があります。言い換えると、CORBA オブジェクトのデータはオブジェクトがメモリでアクティブになったときのみ確立できます。この節では、CORBA オブジェクトのオペレーションを記述する方法、およびそのオペレーションをオブジェクトの一部とする方法を説明します。
特定の CORBA オブジェクトで記述されるオペレーションは、オブジェクトの実装とも呼ばれます。実装は、オブジェクトの振る舞いを実現するコードと見なすことができます。Oracle Tuxedo CORBA クライアント/サーバ アプリケーションを作成する過程では、アプリケーションの OMG IDL ファイルをコンパイルします。OMG IDL ファイルには、アプリケーションのインタフェースおよびそのインタフェースで実行できるオペレーションを記述する文が格納されます。
C++ でサーバ アプリケーションを実装する場合、IDL コンパイラで必要に応じて生成されるファイルの 1 つに実装ファイルのテンプレートがあります。実装ファイルのテンプレートの内容は、アプリケーションのオブジェクトのデフォルトのコンストラクタとメソッド シグネチャです。オブジェクトを実装するコードを記述する場所は、この実装ファイルです。つまり、このファイルには特定のインタフェースのオペレーションのビジネス ロジックが格納されます。
Oracle Tuxedo システムでは、インタフェースを CORBA オブジェクトとして実装します。IDL コンパイラでは、Oracle Tuxedo CORBA クライアント/サーバ アプリケーションに組み込まれ、特定のオブジェクトに記述した実装が実行時に適切なオブジェクト データに接続されるようにするほかのファイルも生成されます。
ここでサーバントの概念が登場します。サーバントとは、オブジェクト クラスのインスタンスのことです。つまり、サーバントは実装ファイルの各オペレーションで記述したメソッド コードのインスタンスです。Oracle Tuxedo CORBA クライアント/サーバ アプリケーションの動作中に、アクティブではない (メモリにない) オブジェクトに対するクライアントの要求がサーバ アプリケーションに届くと、以下のようにイベントが発生します。
Server::create_servant
メソッドを呼び出します。
Server::create_servant
メソッドは、ユーザがすべてを記述します。Server::create_servant
メソッドで記述するコードでは、必要なサーバントをインスタンス化します。コードでは、インタフェース名 (Server::create_servant
メソッドにパラメータとして渡される) を使用して、Oracle Tuxedo ドメインによって作成されるサーバントの型を指定できます。
Oracle Tuxedo ドメインで作成されるサーバントは、特殊なサーバント オブジェクト インスタンスです (CORBA オブジェクトではない)。このサーバントには、必要な CORBA オブジェクトを実装する、以前に記述したオペレーションの実行可能バージョンが格納されます。
activate_object
メソッドを呼び出します (メソッドが実装されている場合)。次のように、activate_object
メソッドを呼び出すと、CORBA オブジェクトがアクティブになります。activate_object
メソッドのコードを記述します。activate_object
メソッドに渡すパラメータは、アクティブにするオブジェクトのオブジェクト ID の文字列値です。オブジェクト ID は、オブジェクトを初期化する方法を指定するために使用できます。
上記の a、b、および c が終わると、CORBA オブジェクトはアクティブと判断されます。
activate_object
メソッドは、必ずしも実装する必要はありません。どのような場合に実装する必要があるのかについては、Oracle Tuxedo オンライン マニュアルの『Tuxedo CORBA サーバ アプリケーションの開発方法』を参照してください。
注意 : | サーバントは CORBA オブジェクトではありません。実際上、サーバントは言語オブジェクトとして表されます。サーバでは、サーバントを通じてオブジェクトでオペレーションを実行します。 |
オブジェクト実装作成の詳細については、Oracle Tuxedo オンライン マニュアルの『Tuxedo CORBA サーバ アプリケーションの開発方法』を参照してください。
CORBA オブジェクトは分散環境で機能するように意図されているので、OMG ではオブジェクト呼び出しのしくみに関するアーキテクチャが定義されています。CORBA オブジェクトは、次の 2 とおりの方法で呼び出すことができます。
動的起動のしくみについては、『Tuxedo CORBA クライアント アプリケーションの開発方法』を参照してください。この節では、動的起動よりも使いやすいスタブ スタイル起動について説明します。
アプリケーションの OMG IDL ファイルをコンパイルするときには、クライアント スタブというソース ファイルがコンパイラによって生成されます。クライアント スタブでは、オブジェクト型の OMG IDL オペレーション定義が、要求を満たすために Oracle Tuxedo システムによって呼び出される CORBA サーバ アプリケーションのオペレーションにマッピングされます。クライアント スタブには、サーバ アプリケーションに要求を送信するときに使用される、クライアント アプリケーションのビルド プロセスで生成されたコードが格納されます。クライアント スタブのコードは絶対に修正しないでください。
IDL コンパイラでは、スケルトンというソース ファイルも生成されます。スケルトンには、OMG IDL ファイルで指定された各インタフェースのオペレーション呼び出しで使用されるコードが格納されます。スケルトンは、クライアントの要求を満たすことができる CORBA オブジェクト実装の適切なコードを指し示すマップです。スケルトンは、オブジェクト実装と Oracle Tuxedo オブジェクト リクエスト ブローカの両方に接続されます。
次の図は、クライアント アプリケーション、クライアント スタブ、スケルトン、および CORBA オブジェクト実装を示しています。
クライアント アプリケーションから要求が送信されると、その要求はクライアント スタブのオペレーションとして実装されます。クライアント スタブで要求を受信すると、クライアント スタブではその要求をオブジェクト リクエスト ブローカ (ORB) に送信します。ORB では、受信した要求を Oracle Tuxedo システムを通じてスケルトンに送信します。ORB は、TP フレームワークおよびポータブル オブジェクト アダプタ (POA) と連携して適切なスケルトンとオブジェクト実装を見つけます。
クライアント スタブおよびスケルトンの生成については、Oracle Tuxedo オンライン マニュアルの『Tuxedo CORBA クライアント アプリケーションの開発方法』および『Tuxedo CORBA サーバ アプリケーションの開発方法』を参照してください。
![]() ![]() ![]() |