COM コネクターのアーキテクチャー
このセクションでは、コネクターのアーキテクチャーについて説明します。図 1 に上位で行われる要求処理を、図 2 にコネクター動作の詳細を示します。
図 1. Connector for COM での要求処理
- コネクターが、統合ブローカーからビジネス・オブジェクト要求を受け取ります。
- コネクターが、ビジネス・オブジェクトのプロキシー・オブジェクト・インスタンスを作成します。プロキシー・オブジェクト・インスタンスは、コネクターが要求を送信する先の COM オブジェクトの代理として機能します。コネクターが
プロキシー・オブジェクトを作成および処理する方法の詳細については、コネクターの動作方法を参照してください。
- コネクターがプロキシー・オブジェクトを使用して、COM サーバーで実行されている対応する COM オブジェクトを呼び出し、データを COM アプリケーションに書き込むことによって、プロキシー・オブジェクトを処理します。
- コネクターが COM サーバー・オブジェクトからデータを読み取りまたは取得して、プロキシー・オブジェクトを更新します。
- アダプターが、元のオブジェクト要求が成功したのか、または失敗 (FAIL 状況) したのかを示すメッセージを統合ブローカーに戻します。要求が成功した場合は、コネクターも統合ブローカーに更新されたビジネス・オブジェクトを戻します。
コネクターの動作方法
このセクションでは、図 2 に示すように、コネクターの各部分がビジネス・オブジェクトを処理する方法について説明します。
-
コネクターの初回始動時に、コネクターのエージェント・クラスが、以下の初期化処理を実行します。
- OLE 環境のインスタンスを生成します。
- コネクター・プロパティーの設定方法に応じて、以下のいずれかを実行します。コネクター・プロパティー、および以下の各シナリオでコネクター・プロパティーがどのように作用するかについての詳細は、コネクター固有のプロパティーを参照してください。
-
シナリオ 1: アプリケーションを参照する接続ファクトリー・オブジェクト・インスタンスの作成。ファクトリー・オブジェクトは、コネクターの寿命に応じて持続し、接続プールに配置される接続を作成します。作成される接続数は、コネクターの PoolSize プロパティーで指定された値によって異なります。
- シナリオ 2: 接続プールに配置される接続オブジェクトのみの作成。接続数は、PoolSize プロパティーで指定した値によって異なります。このシナリオでは、ファクトリー・オブジェクトは作成しません。
- シナリオ 3: ビジネス・オブジェクトによるメソッド呼び出しの対象となるファクトリー・プロキシー・
オブジェクトの作成 (ファクトリー・クラスは BO のプロキシー・クラス ASI と一致)。このシナリオでは、接続は作成しません。
- 統合ブローカーが、ビジネス・オブジェクト形式で、要求をコネクターに送信します。
- コネクターの BO ハンドラーがオブジェクトを受け取ります。
- BO ハンドラーの doVerbFor() メソッドが、BO の ASI を読み取ってプロキシー・クラス名を取得する Dispatch() メソッドを呼び出します。Dispatch() メソッドはプロキシー・クラス名を取得し、それをローダーに送信します。
-
ローダーは、プロキシー・クラス名を使用してプロキシー・クラス (Mypackage.myclass などの有効な Java クラス表記を使用して修飾されているもの) をロードし、プロキシー・オブジェクト・インスタンスを作成して、そのインスタンスを呼び出しごとのオブジェクト・プールにロードします。ローダーは、オブジェクト確認のための検査を行います。検査の内容は以下のとおりです。
- 接続であるか。接続の場合は、接続オブジェクトとして接続プールから検索します。
- ファクトリー・オブジェクトであるか。ファクトリー・オブジェクトの場合は、静的オブジェクトとして接続ファクトリーから検索します。
- ディスパッチを実行して BO の動詞 ASI を読み通し、メソッドのリストを作成します。動詞 ASI は、属性名が配列されたリストです。各属性は、プロキシー・オブジェクトに対するメソッドを表します。つまり、動詞 ASI とは、メソッドのリストではなく、それぞれがプロキシー・オブジェクト・メソッドを表す値を持つ属性のリストです。
-
動詞 ASI リストの各メソッドについて、BO ハンドラーの InvokeMethods() メソッドは、InvokeMethod() を呼び出し、以下のいずれかを実行します。
- メソッドが通常のメソッドである場合は、起動側を呼び出します。引数が外部キーとして
マークされている場合は、呼び出しごとのオブジェクト・プールに引数を保管します。属性が取り込まれていない場合は、use_attribute_value の属性 ASI を検査します。use_attribute_value の ASI が存在する場合は、呼び出しごとのオブジェクト・プールからオブジェクトのプルを試みます。
- プロキシー・オブジェクトのすべての属性に対して、シンクロナイザー (BO ハンドラーのオブジェクト同期プロセス) のロード操作 (LoadFromProxy 関数) と保管操作 (WriteToProxy 関数) を呼び出します。呼び出される操作は、動詞 ASI の内容によって異なります。LoadFromProxy (ロード) および WriteToProxy (保管) は、動詞 ASI に組み込み可能な定義済み関数です。これらの関数は、ビジネス・オブジェクトの単純属性を COM コンポーネントのパブリック・プロパティーに同期させることを目的としています。
- 特定の単純属性に対して、ロード操作または保管操作を呼び出します
(LoadFromProxy を呼び出すと、プロキシー・プロパティーが取得され、BO プロパティーに取得された値が設定されます。WriteToProxy を呼び出すと、BO の値を使用してプロキシー・プロパティーが設定されます)。
注:
動詞 ASI が空の場合、BO ハンドラーは、設定済みのパラメーターを指定して、BO に対するメソッドを検索し、呼び出します。1 つのメソッドのみがパラメーターを設定できます。それ以外、つまり複数のメソッドを設定すると、動詞 ASI が空であっても、コネクターはエラーをログに記録し、FAIL コードを戻します。
- プロキシー・オブジェクトの各メソッドについて、起動側は、以下を実行して、メソッドのパラメーターおよび引数を構成します。
- 起動側は、属性に (String などの単一データ型ではなく) BO 型を発見すると、アクティブな BO ハンドラーに対して再帰的に Dispatch() メソッドを呼び出します。
- Dispatch() は、親メソッドがそのメソッド呼び出しを起動するために使用するプロキシー・オブジェクトを戻します。
- シンクロナイザーと呼ばれる、BO ハンドラーの同期化処理によって
WriteToProxy が起動され、COM コンポーネント (プロキシー・オブジェクト) の各プロパティーに値が保管 (設定) されます。これにより、COM サーバーのデータが更新されます。保管される値は、COM コンポーネントが対応するビジネス・オブジェクトの対応する属性に基づきます。
- COM サーバーから値が戻されると、LoadFromProxy 関数は
プロキシー・オブジェクトの「getters」を呼び出し、プロキシー・オブジェクトから戻されたデータを BO にロードします。
- コネクターが、ビジネス・オブジェクトを統合ブローカーに戻します。
