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オンライン・ドキュメントの『CORBAサーバー・アプリケーションの作成』を参照してください。
クライアント・アプリケーションまたはサーバー・アプリケーションによってオブジェクト参照を使用してオブジェクトに対するリクエストが発行されると、そのオブジェクトがまだメモリーでアクティブになっていない場合は、Oracle Tuxedoサーバー・アプリケーションでオブジェクト参照で指定されたオブジェクトのインスタンス化が行われます (リクエストは常にオブジェクトの特定のオペレーション呼出しにマッピングされる)。
通常、オブジェクトをインスタンス化する過程では、サーバー・アプリケーションによってオブジェクトの状態が初期化されます。その際、オブジェクトの状態はデータベースなどの永続ストレージから読み込まれる場合もあります。
オブジェクトには、以下のために必要なすべてのデータが格納されます。
CORBAオブジェクトを構成するデータは、データベースのレコードをベースとする場合があります。 そのデータベースのレコードは、永続的なオブジェクトの状態です。 このレコードは、次のように操作が行われたときにOracle TuxedoドメインのCORBAオブジェクトからアクセスできるようになります。
Server::create_servant
メソッド(Serverオブジェクトにある)を呼び出すことによってインスタンス化されます。 activate_object
オペレーションが呼び出されます。その結果、状態を格納しているレコードがメモリーに読み込まれます。言語オブジェクトはアプリケーションの実行の境界内にのみ存在しますが、CORBAオブジェクトはプロセスやマシン・システムをまたがって存在できます。 Oracle Tuxedoシステムには、オブジェクトを作成し、そのオブジェクトをアプリケーションからアクセス可能にするためのメカニズムがあります。
Oracle Tuxedo CORBAサーバー・アプリケーションのプログラマは、オブジェクトの状態を初期化するコードとオブジェクトがアクティブでなくなったときにそのオブジェクトの状態を処理するコードを記述する必要があります。オブジェクトのデータが永続ストレージにある場合、このコードには永続ストレージのデータを読み書きするオペレーションが含まれます。サーバー・アプリケーション開発の詳細は、Oracle Tuxedoオンライン・ドキュメントの『CORBAサーバー・アプリケーションの作成』を参照してください。
通常のCORBAオブジェクトの構成要素は次のとおりです(図も参照)。
オブジェクトID (OID)は、オブジェクトとその状態(データベース・レコードなど)を関連付け、オブジェクトのインスタンスを識別します。ファクトリでオブジェクト参照が作成されると、そのオブジェクト参照のリクエストでファクトリに渡されるパラメータに基づいたOIDが割り当てられます。
注意: | サーバー・アプリケーションのプログラマは、Oracle Tuxedoクライアント/サーバー・アプリケーションで使用されるファクトリを作成する必要があります。 プログラマは、OIDを割り当てるコードを記述しなければなりません。 ファクトリの説明およびファクトリ作成の例については、『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オンライン・ドキュメントの『CORBAサーバー・アプリケーションの作成』を参照してください。
注意: | サーバントはCORBAオブジェクトではありません。 実際上、サーバントは言語オブジェクトとして表されます。 サーバーでは、サーバントを通じてオブジェクトでオペレーションを実行します。 |
オブジェクト実装作成の詳細は、Oracle Tuxedoオンライン・ドキュメントの『CORBAサーバー・アプリケーションの作成』を参照してください。
CORBAオブジェクトは分散環境で機能するように意図されているので、OMGではオブジェクト呼出しのしくみに関するアーキテクチャが定義されています。 CORBAオブジェクトは、次の2とおりの方法で呼び出すことができます。
動的起動のしくみについては、『CORBAクライアント・アプリケーションの作成』を参照してください。この項では、動的起動よりも使いやすいスタブ・スタイル起動について説明します。
アプリケーションのOMG IDLファイルをコンパイルするときには、クライアント・スタブというソース・ファイルがコンパイラによって生成されます。クライアント・スタブでは、オブジェクト型のOMG IDLオペレーション定義が、リクエストを満たすためにOracle Tuxedoシステムによって呼び出されるCORBAサーバー・アプリケーションのオペレーションにマッピングされます。クライアント・スタブには、サーバー・アプリケーションにリクエストを送信するときに使用される、クライアント・アプリケーションのビルド・プロセスで生成されたコードが格納されます。クライアント・スタブのコードは絶対に修正しないでください。
IDLコンパイラでは、スケルトンというソース・ファイルも生成されます。スケルトンには、OMG IDLファイルで指定された各インタフェースのオペレーション呼出しで使用されるコードが格納されます。スケルトンは、クライアントのリクエストを満たすことができるCORBAオブジェクト実装の適切なコードを指し示すマップです。スケルトンは、オブジェクト実装とOracle Tuxedoオブジェクト・リクエスト・ブローカの両方に接続されます。
次の図は、クライアント・アプリケーション、クライアント・スタブ、スケルトン、およびCORBAオブジェクト実装を示しています。
クライアント・アプリケーションからリクエストが送信されると、そのリクエストはクライアント・スタブのオペレーションとして実装されます。クライアント・スタブでリクエストを受信すると、クライアント・スタブではそのリクエストをオブジェクト・リクエスト・ブローカ(ORB)に送信します。ORBでは、受信したリクエストをOracle Tuxedoシステムを通じてスケルトンに送信します。ORBは、TPフレームワークおよびポータブル・オブジェクト・アダプタ(POA)と連携して適切なスケルトンとオブジェクト実装を見つけます。
クライアント・スタブおよびスケルトンの生成については、Oracle Tuxedoオンライン・ドキュメントの『CORBAクライアント・アプリケーションの作成』および『Oracle Tuxedo ATMI C関数リファレンス』を参照してください。