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オブジェクトからアクセスできるようになります。
1.
|
サーバー・アプリケーションのファクトリでオブジェクトの参照が作成されます。オブジェクト参照には、データベースのレコードを見つける方法についての情報が含まれています。
|
2.
|
ファクトリで作成されたオブジェクト参照を使用し、クライアント・アプリケーションでオブジェクトに対するリクエストが発行されます。
|
3.
|
オブジェクトがインスタンス化されます。オブジェクトは、TPフレームワークにより Server::create_servantメソッド(Serverオブジェクトにある)を呼び出すことによってインスタンス化されます。
|
4.
|
Oracle Tuxedoドメインによって、そのオブジェクトで activate_objectオペレーションが呼び出されます。その結果、状態を格納しているレコードがメモリーに読み込まれます。
|
言語オブジェクトはアプリケーションの実行の境界内にのみ存在しますが、CORBAオブジェクトはプロセスやマシン・システムをまたがって存在できます。Oracle Tuxedoシステムには、オブジェクトを作成し、そのオブジェクトをアプリケーションからアクセス可能にするためのメカニズムがあります。
Oracle Tuxedo CORBAサーバー・アプリケーションのプログラマは、オブジェクトの状態を初期化するコードとオブジェクトがアクティブでなくなったときにそのオブジェクトの状態を処理するコードを記述する必要があります。オブジェクトのデータが永続ストレージにある場合、このコードには永続ストレージのデータを読み書きするオペレーションが含まれます。サーバー・アプリケーション開発の詳細は、Oracle Tuxedoオンライン・ドキュメントの
『CORBAサーバー・アプリケーションの作成』を参照してください。
通常のCORBAオブジェクトの構成要素は次のとおりです(図も参照)。
•
|
インタフェース(CORBAオブジェクトのデータとオペレーションを指定する)
|
以降の項では、オブジェクトの各構成要素を詳しく説明します。
オブジェクトID (OID)は、オブジェクトとその状態(データベース・レコードなど)を関連付け、オブジェクトのインスタンスを識別します。ファクトリでオブジェクト参照が作成されると、そのオブジェクト参照のリクエストでファクトリに渡されるパラメータに基づいたOIDが割り当てられます。
注意:
|
サーバー・アプリケーションのプログラマは、Oracle Tuxedoクライアント/サーバー・アプリケーションで使用されるファクトリを作成する必要があります。プログラマは、OIDを割り当てるコードを記述しなければなりません。ファクトリの説明およびファクトリ作成の例については、 『CORBAサーバー・アプリケーションの作成』を参照してください。
|
Oracle Tuxedoシステムでは、次の情報を利用してオブジェクトをインスタンス化する方法を指定できます。
オブジェクトのインタフェース(アプリケーションのOMG IDLファイルで記述)は、データおよびオブジェクトに対して実行できるオペレーションを識別します。たとえば、University窓口オブジェクトのインタフェースでは次のものが識別されます。
•
|
オブジェクトと関連付けられているデータ型(窓口IDや窓口の引出しにある現金など)、およびオブジェクトによって管理されるデータ(口座など)
|
•
|
オブジェクトで実行できるオペレーション(口座の残高照会や口座振替など)
|
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クライアント/サーバー・アプリケーションの動作中に、アクティブではない(メモリーにない)オブジェクトに対するクライアントのリクエストがサーバー・アプリケーションに届くと、次のようにイベントが発生します。
1.
|
必要なオブジェクトで利用可能なサーバントがない場合、Oracle TuxedoシステムではServerオブジェクトの Server::create_servantメソッドを呼び出します。
|
Server::create_servantメソッドは、ユーザーがすべてを記述します。
Server::create_servantメソッドで記述するコードでは、必要なサーバントをインスタンス化します。コードでは、インタフェース名(
Server::create_servantメソッドにパラメータとして渡される)を使用して、Oracle Tuxedoドメインによって作成されるサーバントの型を指定できます。
Oracle Tuxedoドメインで作成されるサーバントは、特殊なサーバント・オブジェクト・インスタンス
です(CORBAオブジェクトではありません)。このサーバントには、必要なCORBAオブジェクトを実装する、以前に記述したオペレーションの実行可能バージョンが格納されます。
2.
|
Oracle Tuxedoドメインでは、制御をサーバントに渡し、必要に応じてサーバントの activate_objectメソッドを呼び出します(メソッドが実装されている場合)。次のように、 activate_objectメソッドを呼び出すと、CORBAオブジェクトがアクティブになります。
|
a.
|
activate_objectメソッドのコードを記述します。 activate_objectメソッドに渡すパラメータは、アクティブにするオブジェクトのオブジェクトIDの文字列値です。オブジェクトIDは、オブジェクトを初期化する方法を指定するために使用できます。
|
b.
|
CORBAオブジェクトのデータを初期化します。その際には、永続ストレージ(データベースのレコードなど)から状態データを読み込む場合もあります。
|
c.
|
サーバントのオペレーションがデータにバインドされ、そのオペレーションとデータの結合によってアクティブなCORBAオブジェクトが確立されます。
|
前述の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言語関数リファレンス』を参照してください。