FactoryFinderインタフェースは、Oracle Tuxedoドメインへの唯一のエントリ・ポイントとして作用する1つのオブジェクト参照をクライアントに提供します。Oracle Tuxedo NameManagerにより、FactoryFinderのオブジェクト参照に対するファクトリ名のマッピングが提供されます。複数のFactoryFinderとNameManagerが一緒になると、可用性と信頼性が向上します。このリリースでは、機能性のレベルを拡張して、複数ドメインをサポートしています。
注: | NameManagerはCORBAサービス・ネーミング・サービスのようなネーミング・サービスではなく、登録されたファクトリを格納するための単なる手段です。 |
Oracle Tuxedo環境では、アプリケーション・ファクトリ・オブジェクトを使用して、クライアントがビジネス操作(TellerFactory、Tellerなど)の実行のためにやり取りするオブジェクトを作成します。一般に、アプリケーション・ファクトリはサーバーの初期化中に作成され、リモート・クライアントと、サーバー・アプリケーション内に置かれたクライアントの双方からアクセスされます。
FactoryFinderインタフェースとNameManagerサービスは、アプリケーション・サーバーではない個別のサーバーに格納されています。クライアントとサーバーの両アプリケーションがファクトリ情報にアクセスしてこれを更新できるように、アプリケーション・プログラミング・インタフェース(API)のセットが提供されています。
このリリースで複数ドメインをサポートしたことにより、多数のマシンを使用するようスケーリングしたり、アプリケーション環境を分割したりする必要のある顧客にとっての利便性が向上しています。複数ドメインをサポートするために、Oracle Tuxedo環境内でファクトリを見つけるためのメカニズムが拡張され、あるドメインのファクトリを別のドメインでも認識できるようになっています。別のドメインのファクトリの可視性は、システム管理者によって制御されます。
アプリケーション・ファクトリは、サーバー・アプリケーションの初期化中にNameManagerで登録する必要があります。それにより、クライアントにFactoryFinderのオブジェクト参照を提供し、それらがファクトリ登録時に作成された関連する名前に基づくファクトリ・オブジェクト参照を取得することを可能にします。
以下の機能、制限事項、および要件が、このリリースに適用されます。
CosLifeCycle::FactoryFinder
インタフェースに準拠しています。
Oracle Tuxedo CORBA環境では、クライアントがオブジェクトへのリファレンスを取得するための主な手段として、ファクトリ・デザイン・パターンの使用が促進されます。このデザイン・パターンを使用することにより、クライアント・アプリケーションには、別のオブジェクトのファクトリとして動作するオブジェクトへのリファレンスを取得するメカニズムが必要となります。Oracle Tuxedo環境では、CORBAを可視プログラミング・モデルとして選択しているため、ファクトリをロケートするためのメカニズムは、Object Management GroupのCORBAサービス仕様(1997年12月)の第6章「Life Cycle Service」で示されているように、FactoryFinderをモデルとしています。
CORBA FactoryFinderモデルでは、アプリケーション・サーバーはアクティブ化されたファクトリをFactoryFinderに登録します。アプリケーション・サーバーのファクトリが非アクティブになると、アプリケーション・サーバーはFactoryFinderから対応する登録を削除します。クライアント・アプリケーションは、FactoryFinderに問合せを行うことによって、ファクトリをロケートします。クライアント・アプリケーションは、1つまたは複数のリファレンスの選択に使用される基準を指定することによって、返されたファクトリ・オブジェクトへのリファレンスを制御できます。
クライアント・アプリケーションは、適切なファクトリを探し始める前に、FactoryFinderへのリファレンスを取得する必要があります。クライアント・アプリケーションが関連付けられているドメイン内のFactoryFinderへのリファレンスを取得するには、クライアント・アプリケーションは次の2つのブートストラップ処理メカニズムのうち、いずれかを使用します。
“FactoryFinder"
の値を持つTobj_Bootstrap::resolve_initial_references
操作を呼び出します。この操作は、クライアント・アプリケーションが現在属しているドメイン内のFactoryFinderへのリファレンスを返します。Oracle Tuxedoクライアント・ソフトウェアを使用している場合は、このメカニズムを使用します。詳細は、「Tobj_Bootstrap::resolve_initial_references」を参照してください。“FactoryFinder"
の値を持つCORBA::ORB::resolve_initial_references
操作を呼び出します。この操作は、クライアント・アプリケーションが現在属しているドメイン内のFactoryFinderへのリファレンスを返します。サード・パーティ製のクライアントORBを使用している場合は、このメカニズムを使用します。詳細は、「CORBA::ORB::resolve_initial_references」を参照してください。注: | クライアント・アプリケーションに返されるFactoryFinderへのリファレンスは、そのFactoryFinderと同じマシンに登録されたファクトリ・オブジェクトへのリファレンス、別のマシンに登録されたファクトリ・オブジェクトへのリファレンス、または別のドメインに登録されたファクトリ・オブジェクトへのリファレンスである可能性があります。 |
クライアント・アプリケーションがファクトリへのリファレンスを取得できるようになるには、アプリケーション・サーバーが、FactoryFinderによる実装の提供先となる任意のファクトリ・オブジェクトへのリファレンスを登録する必要があります(図5-1を参照)。Oracle Tuxedo CORBA TPフレームワークにより、ファクトリ・オブジェクトのリファレンスの登録は、それが作成された後にTP::register_factory
操作を使用することにより行われます。ファクトリ・オブジェクトへのリファレンスは、そのファクトリを識別する値と共に、この操作に渡されます。ファクトリ・オブジェクトのリファレンスの登録は、通常はアプリケーションの初期化手順の一部(普通は、操作Server::initialize
の実装の一部)として行われます。
サーバー・アプリケーションは、停止時には以前にアプリケーション・サーバーに登録されたファクトリ・オブジェクトへのリファレンスを、すべて登録を削除する必要があります。これは、ファクトリ・オブジェクトへの同じリファレンスと、ファクトリの識別に使用する対応する値を、TP::unregister_factory
操作に渡すことによって行われます。登録が削除されると、ファクトリ・オブジェクトへのリファレンスは破棄できるようになります。FactoryFinderでのファクトリの登録を削除するプロセスは、通常はServer::release
操作の実装の一環として行われます。これらの操作の詳細は、「Serverインタフェース」を参照してください。
リスト5-1では、C++のクラスの(静的)メソッドを示します。これらのメソッドの詳細は、「TP::register_factory()」および「TP::unregister_factory()」を参照してください。
#include <TP.h>
static voidTP::register_factory
(
CORBA::Object_ptr factory_or, const char* factory_id);
static voidTP::unregister_factory
(
CORBA::Object_ptr factory_or, const char* factory_id);
TP.hヘッダー・ファイルには、2つのメソッド宣言が含まれています。このファイルは、これらのメソッドを使用するすべてのサーバー・アプリケーションに含める必要があります。
一般に、サーバー・アプリケーションはこのヘッダー・ファイルを、アプリケーション・サーバーの初期化と解放のためのメソッドを含むアプリケーション・ファイル内に格納しています。
クライアントが、オブジェクトへのリファレンスを作成するファクトリをリクエストするためには、まずファクトリ・オブジェクトへのリファレンスを取得することが必要です。ファクトリ・オブジェクトへのリファレンスは、特定の選択基準でFactoryFinderへの問合せを行うことによって取得します(図5-2を参照)。基準は、使用されている特定のFactoryFinderインタフェースおよびメソッドの形式によって決まります。
Oracle Tuxedo CORBAは、FactoryFinder用に宣言されたfind_factories()
メソッドに加えて、4つのメソッドを導入することによって、CosLifeCycle::FactoryFinder
インタフェースを拡張します。したがって、Tobjの拡張により、クライアントはfind_factories(
)メソッドまたはfind_factories_by_id()
メソッドのいずれかを使って、アプリケーション・ファクトリのリストを取得できます。またクライアントは、単一のアプリケーション・ファクトリを取得するためにfind_one_factory
()メソッドまたはfind_one_factory_by_id
()メソッドを使用し、登録されている全ファクトリのリストを取得するためにlist_factories ()
メソッドを使用します。
注: | Tobj_Bootstrapオブジェクトを使用する場合は、CosLifeCycle::FactoryFinder インタフェースにOracle Tuxedo CORBAの拡張を使用できますが、このオブジェクトはファクトリを見つけるために必須のものではありません。CORBA INSを使用していれば、CosLifeCycle::FactoryFinder インタフェースにより提供されるfind_factories() メソッドを使用できます。 |
CosLifeCycle::FactoryFinder
インタフェースは、factory_key
を定義します。これは、下記のCosNaming名に準拠した、id
文字列とkind
文字列のシーケンスです。アプリケーション・ファクトリの登録時に、TPフレームワークによって、全アプリケーション・ファクトリのNameComponentにおけるkind
フィールドが、文字列FactoryInterface
に設定されます。アプリケーションは、id
フィールドの値を自身で指定します。
次のリストでは、CORBAサービス・ライフサイクル・サービスのモジュールが、自身のファイル(それぞれns.idl
およびlcs.idl
)内にあると仮定して、Oracle Tuxedo FactoryFinderの使用に適した両ファイルのサブセットのためのOMG IDLコードのみが示されます。
リスト5-2では、FactoryFinderに関連のns.idl
ファイルを部分的に示します。
// ------ ns.idl ------
module CosNaming {
typedef string Istring;
struct NameComponent {
Istring id;
Istring kind;
};
typedef sequence <NameComponent> Name;
};
// This information is taken from CORBAservices: Common Object
// Services Specification, page 3-6. Revised Edition:
// March 31, 1995. Updated: November 1997. Used with permission by OMG.
リスト5-3では、FactoryFinderに関連のlcs.idl
ファイルを部分的に示します。
// ----- lcs.idl -----
#include “ns.idl”
module CosLifeCycle{
typedef CosNaming::Name Key;
typedef Object Factory;
typedef sequence<Factory> Factories;
exception NoFactory{ Key search_key; }
interface FactoryFinder {
Factories find_factories(in Key factory_key)
raises(NoFactory);
};
};
// This information is taken from CORBAservices: Common Object
// Services Specification, pages 6-10, 11. Revised Edition:
// March 31, 1995. Updated: November 1997. Used with permission by OMG.
リスト5-4は、TobjモジュールのOMG IDLを示します。
// ----- Tobj.idl -----
module Tobj {
// Constants
const string FACTORY_KIND = "FactoryInterface";
// Exceptions
exception CannotProceed { };
exception InvalidDomain {};
exception InvalidName { };
exception RegistrarNotAvailable { };
// Extension to LifeCycle Service
struct FactoryComponent {
CosLifeCycle::Key factory_key;
CosLifeCycle::Factory factory_ior;
};
typedef sequence<FactoryComponent> FactoryListing;
interface FactoryFinder : CosLifeCycle::FactoryFinder {
CosLifeCycle::Factory find_one_factory(in CosLifeCycle::Key
factory_key)
raises (CosLifeCycle::NoFactory,
CannotProceed,
RegistrarNotAvailable);
CosLifeCycle::Factory find_one_factory_by_id(in string
factory_id)
raises (CosLifeCycle::NoFactory,
CannotProceed,
RegistrarNotAvailable);
CosLifeCycle::Factories find_factories_by_id(in string
factory_id)
raises (CosLifeCycle::NoFactory,
CannotProceed,
RegistrarNotAvailable);
FactoryListing list_factories()
raises (CannotProceed,
RegistrarNotAvailable);
};
};
通常、FactoryFinderは自身と同じドメイン内にあるファクトリ・オブジェクトへのリファレンスを返します。しかし、FactoryFinderが存在しているドメイン以外のドメイン内のファクトリ・オブジェクトへのリファレンスを返すこともできます。これは、FactoryFinderに別ドメイン内のファクトリの情報が含まれている場合に実現可能です(図5-3を参照)。FactoryFinderは、これらのほかのファクトリ・オブジェクトの場所を説明する構成情報から、これらドメイン間のファクトリ・オブジェクトについて調べます。
FactoryFinderは、ファクトリ・オブジェクトをロケートするリクエストを受信すると、まず指定された基準に合致するファクトリ・オブジェクトへのリファレンスが存在するかどうかを判断する必要があります。基準に合致するファクトリ・オブジェクトの登録情報があれば、FactoryFinderはそれが現在のドメインから見てローカルな場所にあるのか、それとも別ドメインからのインポートを必要とするのかを判断する必要があります。ファクトリ・オブジェクトがローカル・ドメインからのものであれば、FactoryFinderはファクトリ・オブジェクトへのリファレンスをクライアントに返します。
その一方で、もしその情報が、実際のファクトリ・オブジェクトが別ドメインからのものであることを示していれば、FactoryFinderはリクエストを適切なドメインにあるドメイン間のFactoryFinderに委任します。その結果、ファクトリ・オブジェクトと同じドメイン内のFactoryFinderのみが、ファクトリ・オブジェクトへの実際のリファレンスを含むこととなります。ドメイン間のFactoryFinderは、ファクトリ・オブジェクトのリファレンスをローカルのFactoryFinderに返す役割を果たします。そこからその要求は、クライアントに返されます。
Oracle Tuxedoソフトウェアは、Object Management GroupのCORBAサービス仕様(1997年12月)の第6章「Life Cycle Service」で定義されているインタフェースを、以下の理由により拡張しています。
したがって、Oracle TuxedoはFactoryFinderを使いやすくするために、CORBAサービスの仕様で定義されているインタフェースを拡張します。拡張は、CORBAサービスの仕様で指定されたインタフェースから派生する、FactoryFinderの高度化したインタフェースとなります。
FactoryFinderインタフェースで提供される5つのメソッドのうち2つが、CosNaming::Name
に対応するCosLifeCycle::Keys
を受け付けます。クライアントは、これらのキーを構築できなければなりません。
CosNamingの仕様では、CosLifeCycle::Keys
の作成と操作に使用可能な名前ライブラリ・インタフェースを構成する、2つのインタフェースが説明されています。これらのインタフェースの擬似OMG IDL文については、次のセクションで説明します。
注: | この情報は、「CORBAservices: Common Object Services Specification」の3-14ページから18ページから引用しました。改訂版: 1995年3月31日更新: 1997年11月。また、この情報は、OMGの権限を得て転載しています。 |
既存のクライアント・アプリケーションに影響を与えることなく名前の表現を生成するには、名前の表現をクライアント・アプリケーションから認識できないようにしたほうがよいでしょう。名前自体がオブジェクトとなることが理想ですが、名前は作成、操作、送信が効率的に行える、ライト・ウェイトのエンティティでなければなりません。したがって、名前は名前ライブラリからプログラムに提示されます。
名前ライブラリは、名前を擬似オブジェクトとして実装します。クライアント・アプリケーションは、通常のオブジェクトを呼び出す場合と同じやり方で、擬似オブジェクトに対し呼出しを行います。ライブラリ名は、擬似IDLで記述されます。これにより、適切な言語バインディングが示唆されます。C++クライアント・アプリケーションは、擬似IDL (PIDL)でも、IDLの場合と同じクライアント言語バインディングを使用します。
擬似オブジェクト参照は、OMG IDLインタフェース間で渡すことはできません。「CORBAservices: Common Object Services Specification」の第3章の「The CosNaming Module」で説明されるように、CORBAサービス・ネーミング・サービスは、NamingContext OMG IDLインタフェースをサポートしています。名前ライブラリは、NamingContextインタフェースを通じてライブラリ名をネーム・サービスに渡せる値に変換する操作をサポートしています。
注: | CORBAサービス・ネーミング・サービスを使用するのに、名前ライブラリの使用は必須ではありません。 |
名前ライブラリは、リスト5-5に示すようにLNameComponentインタフェースおよびLNameインタフェースという2つの擬似IDLインタフェースで構成されています。
interface LNameComponent { // PIDL
const short MAX_LNAME_STRLEN = 128;
exception NotSet{ };
exception OverFlow{ };
string get_id
raises (NotSet);
void set_id(in string i)
raises (OverFlow);
string get_kind()
raises(NotSet);
void set_kind(in string k)
raises (OverFlow);
void destroy();
};
interface LName { // PIDL
exception NoComponent{ };
exception OverFlow{ };
exception InvalidName{ };
LName insert_component(in unsigned long i,
in LNameComponent n)
raises (NoComponent, OverFlow);
LNameComponent get_component(in unsigned long i)
raises (NoComponent);
LNameComponent delete_component(in unsigned long i)
raises (NoComponent);
unsigned long num_components();
boolean equal(in LName ln);
boolean less_than(in LName ln);
Name to_idl_form()
raises (InvalidName);
void from_idl_form(in Name n);
void destroy();
};
LName create_lname(); // C/C++
LNameComponent create_lname_component(); // C/C++
ライブラリ名コンポーネントの擬似オブジェクトを作成するには、次のC/C++関数を使用します。
LNameComponent create_lname_component(); // C/C++
返された擬似オブジェクトは、その後リスト5-5に示す操作を使用して操作できます。
ライブラリ名の擬似オブジェクトを作成するには、次のC/C++関数を使用します。
LName create_lname(); // C/C++
返された擬似オブジェクト参照は、その後リスト5-5に示す操作を使用して操作できます。
名前コンポーネントは、identifier
およびkind
という2つの属性で構成されています。LNameComponentインタフェースは、次のように、これらの属性と関連付けられた操作を定義します。
string get_id()
raises(NotSet);
void set_id(in string k);
string get_kind()
raises(NotSet);
void set_kind(in string k);
get_id
set_id
get_kind
set_kind
destroy
操作は、ライブラリ名コンポーネント擬似オブジェクトを破棄します。
名前には、1つまたは複数のコンポーネントがあります。各コンポーネントは、最後のもの以外は、サブコンテキストの名前を識別するために使用されます。(最後のコンポーネントは、バウンド・オブジェクトを示します。)insert_component
操作は、位置i
の後にコンポーネントを挿入します。
LName insert_component(in unsigned long i, in LNameComponent lnc)
raises(NoComponent, OverFlow);
コンポーネントi
-1が未定義で、コンポーネントi
が1より大きい場合、insert_component
操作は、NoComponent
例外を生成します。
ライブラリが、挿入されたコンポーネントにリソースを割り当てられない場合は、OverFlow
例外が発生します。
get_component
操作は、i
番目のコンポーネントを返します。最初のコンポーネントの番号を「1」とします。
LNameComponent get_component(in unsigned long i)
raises(NoComponent);
コンポーネントが存在しない場合は、NoComponent
例外が発生します。
delete_component
操作は、i
番目のコンポーネントを削除して返します。
LNameComponent delete_component(in unsigned long i)
raises(NoComponent);
コンポーネントが存在しない場合は、NoComponent
例外が発生します。
delete_component
操作の実行後は、複合名のコンポーネントが1つ減り、それまでi
+1...nと認識されてきたコンポーネントが、i
...n-1と認識されるようになります。
num_components
操作は、ライブラリ名に含まれるコンポーネントの数を返します。
unsigned long num_components();
equal操作は、ライブラリ名ln
との等価性をテストします。
less_than
操作は、ライブラリ名ln
に対しての、ライブラリ名の順序をテストします。
boolean less_than(in LName ln);
この操作は、ライブラリ名が、引数として渡されたライブラリ名ln
よりも小さい値の場合に、TRUE
を返します。ライブラリの実装は、名前の順序付けを定義します。
擬似オブジェクトは、OMG IDLインタフェース間で渡すことはできません。ライブラリ名は、擬似オブジェクトです。したがって、CORBAサービス・ネーミング・サービスのOMG IDLインタフェースを越えて渡すことはできません。NamingContextインタフェースのいくつかの操作には、OMG IDL定義の構造体Name
の引数があります。ライブラリ名に対する次のPIDL操作は、OMG IDLリクエストにわたって渡すことが可能な構造体を生成します。
Name to_idl_form()
raises(InvalidName);
名前の長さが0(ゼロ)の場合、InvalidName
例外が返されます。
擬似オブジェクトは、OMG IDLインタフェース間で渡すことはできません。ライブラリ名は、擬似オブジェクトです。したがって、CORBAサービス・ネーミング・サービスのOMG IDLインタフェースを越えて渡すことはできません。NamingContextインタフェースは、Name
型のIDL structを返す操作を定義します。ライブラリ名に対する次のPIDL操作は、返されたOMG IDL構造体Name
からのライブラリ名のコンポーネントおよびkind
属性を設定します。
void from_idl_form(in Name n);
destroy
操作は、ライブラリ名擬似オブジェクトを破棄します。
名前ライブラリの擬似OMG IDLインタフェースは、リスト5-6に示すC++クラスにマッピングします。このリストは、NamesLib.h
ヘッダー・ファイルにあります。
スケーラビリティをサポートするために、CORBAに対する2つのOracle Tuxedo拡張が含まれています。具体的には、入力文字列の長さがMAX_LNAME_STRLEN
を超えると、LNameComponent::set_id()
メソッドおよびLNameComponent::set_kind()
メソッドが、OverFlow
例外を生成します。この長さは、Oracle TuxedoオブジェクトID (OID)およびインタフェース名の最大長に一致します。ライブラリ名クラスの詳細は、「名前ライブラリ・インタフェースの擬似OMG IDL」を参照してください。
const short MAX_LNAME_STRLEN = 128;
class LNameComponent {
public:
class NotSet{ };
class OverFlow{ };
static LNameComponent* create_lname_component();
void destroy();
const char* get_id() const throw (NotSet);
void set_id(const char* i) throw (OverFlow);
const char* get_kind() const throw (NotSet);
void set_kind(const char* k) throw (OverFlow);
};
class LName {
public:
class NoComponent{ };
class OverFlow{ };
class InvalidName{ };
static LName* create_lname();
void destroy();
LName* insert_component(const unsigned long i,
LNameComponent* n)
throw (NoComponent, OverFlow);
const LNameComponent* get_component(
const unsigned long i) const
throw (NoComponent);
const LNameComponent* delete_component(
const unsigned long i)
throw (NoComponent);
unsigned long num_components() const;
CORBA::Boolean equal(const LName* ln) const;
CORBA::Boolean less_than(
const LName* ln) const; // not implemented
CosNaming::Name* to_idl_form()
throw (InvalidName);
void from_idl_form(const CosNaming::Name& n);
};
名前ライブラリ擬似OMG IDLインタフェースは、リスト5-7
で示すcom.beasys.Tobjパッケージに含まれているJavaクラスにマッピングします。例外はすべて、同じパッケージ内に包含されています。
ライブラリ名クラスの詳細は、「CORBAservices: Common Object Services Specification」の第3章を参照してください。
public class LNameComponent {
public static LNameComponent create_lname_component();
public static final short MAX_LNAME_STRING = 128;
public void destroy();
public String get_id() throws NotSet;
public void set_id(String i) throws OverFlow;
public String get_kind() throws NotSet;
public void set_kind(String k) throws OverFlow;
};
public class LName {
public static LName create_lname();
public void destroy();
public LName insert_component(long i, LNameComponent n)
throws NoComponent, OverFlow;
public LNameComponent get_component(long i)
throws NoComponent;
public LNameComponent delete_component(long i)
throws NoComponent;
public long num_components();
public boolean equal(LName ln);
public boolean less_than(LName ln); // not implemented
public org.omg.CosNaming.NameComponent[] to_idl_form()
throws InvalidName;
public void from_idl_form(org.omg.CosNaming.NameComponent[] nr);
};
このセクションでは、FactoryFinderのC++メンバー関数とJavaメソッドについて説明します。
注: | LNameのless_than メンバー関数を除き、FactoryFinderメンバー関数はすべて、C++でもJavaでも実装されます。 |
注: | CosLifeCycle::FactoryFinder::find_factories メソッドは、標準的なCORBA CosLifeCycleメソッドです。4つのTobjメソッドは、CosLifeCycleインタフェースに対する拡張であり、したがって、CosLifeCycleインタフェースの属性を継承しています。 |
CosLifeCycle::Factories *
CORBA::Object_ptr CosLifeCycle::FactoryFinder::find_factories(
const CosNaming::Name& factory_key)
throw (CosLifeCycle::NoFactory);
import org.omg.CosLifeCycle.*;
public org.omg.CORBA.Object[] find_factories(
org.omg.CosNaming.NameComponent[] factory_key)
throws org.omg.CosLifeCycle.NoFactory;
factory_key
id
およびkind
の2つのメンバーを持つものとして定義され、これらのメンバーはどちらも文字列型です。id
フィールドは、ファクトリ・オブジェクトのIDを表すのに使用されます。kind
フィールドは、id
フィールドの値をどのように解釈するかを示すのに使用されます。操作TP::register_factory
を使用して登録されたファクトリ・オブジェクトへの参照のkind値は、"FactoryInterface"
となります。
CORBA::BAD_PARAM
factory_key
に指定された値が存在しないか、NULL値であった場合に発生するということです。
CosLifeCycle::NoFactory
アプリケーションによってfind_factories
メソッドが呼び出され、ファクトリ・オブジェクト参照のシーケンスが取得されます。操作には、必要なファクトリを識別するキーが渡されます。このキーは、CORBAサービス・ネーミング・サービスで定義した名前です。キーに一致するファクトリは複数存在することがあります。そのような場合、FactoryFinderはファクトリのシーケンスを返します。
このキーのスコープは、FactoryFinderです。FactoryFinderは、キーにセマンティクスを割り当てません。単に、キーを照合するだけです。インタフェースや返されたファクトリの実装、または作成するオブジェクトについての保証も行いません。
キー値が等価であると見なされるのは、長さが等しい、つまりシーケンス中の要素数が同じである場合と、キーの中の各NameComponent値がすべて、ファクトリ・オブジェクトへのリファレンス登録時に指定されたキーの中のまったく同じ場所にある、対応するNameComponent値に一致する場合です。
factory_key
パラメータの値として指定された情報に一致する、ファクトリ・オブジェクトへのリファレンスの無制限シーケンスです。C++では、メソッドはCosLifeCycle::Factory
型のオブジェクト参照のシーケンスを返します。Javaでは、メソッドはorg.omg.CORBA.Object
型のオブジェクト参照の無制限配列を返します。
操作が例外を生成した場合には、戻り値は無効であり、呼出し側によって解放される必要はありません。
単一のファクトリ・オブジェクトへのリファレンスを取得します。
virtual CosLifeCycle::Factory_ptr
find_one_factory( const CosNaming::Name& factory_key) = 0;
public org.omg.CORBA.Object
find_one_factory( org.omg.CosNaming.NameComponent[] factory_key)
throws
org.omg.CosLifeCycle.NoFactory,
com.beasys.Tobj.CannotProceed,
com.beasys.Tobj.RegistrarNotAvailable;
factory_key
id
およびkind
の2つのメンバーを持つものとして定義され、これらのメンバーはどちらも文字列型です。id
フィールドは、ファクトリ・オブジェクトのIDを表すのに使用されます。kind
フィールドは、id
フィールドの値をどのように解釈するかを示すのに使用されます。操作TP::register_factory
を使用して登録されたファクトリ・オブジェクトへの参照のkind値は、"FactoryInterface"
となります。
CORBA::BAD_PARAM
factory_key
に指定された値が存在しないか、NULL値であった場合に発生するということです。
CosLifeCycle::NoFactory
Tobj::CannotProceed
Tobj::RegistrarNotAvailable
アプリケーションによりfind_one_factory
メソッドが呼び出され、メソッドへの入力として指定されたキーの値と一致するキーを備えた唯一のファクトリ・オブジェクトへのリファレンスが取得されます。指定されたキーで複数のファクトリ・オブジェクトが登録されている場合、FactoryFinderのロード・バランシング・スキームに基づき、FactoryFinderはファクトリ・オブジェクトを1つ選択します。その結果、同じキーでfind_one_factory
メソッドを複数回呼び出すと、様々なオブジェクト参照が返ることがあります。
このキーのスコープは、FactoryFinderです。FactoryFinderは、キーにセマンティクスを割り当てません。単に、キーを照合するだけです。インタフェースや返されたファクトリの実装、または作成するオブジェクトについての保証も行いません。
キー値が等価であると見なされるのは、長さが等しい、つまりシーケンス中の要素数が同じである場合と、キーの中の各NameComponent値がすべて、ファクトリ・オブジェクトへのリファレンス登録時に指定されたキーの中のまったく同じ場所にある、対応するNameComponent値に一致する場合です。
ファクトリ・オブジェクトのオブジェクト参照です。C++では、メソッドはCosLifeCycle::Factory
型のオブジェクト参照を返します。Javaでは、メソッドはorg.omg.CORBA.Object
型のオブジェクト参照を返します。
操作が例外を生成した場合には、戻り値は無効であり、呼出し側によって解放される必要はありません。
単一のファクトリ・オブジェクトへのリファレンスを取得します。
virtual CosLifeCycle::Factory_ptr
find_one_factory_by_id( const char * factory_id) = 0;
public org.omg.CORBA.Object
find_one_factory_by_id( java.lang.String factory_id)
throws
org.omg.CosLifeCycle.NoFactory,
com.beasys.Tobj.CannotProceed,
com.beasys.Tobj.RegistrarNotAvailable;
factory_id
factory_id
パラメータの値は、ファクトリ・オブジェクトに対する登録済リファレンスと対比したときに値が“FactoryInterface"
となっている、kind
フィールドを備えるNameComponentの、id
フィールドの値として使用されます。
CORBA::BAD_PARAM
factory_key
に指定された値が存在しないか、NULL値であった場合に発生するということです。
CosLifeCycle::NoFactory
Tobj::CannotProceed
Tobj::RegistrarNotAvailable
アプリケーションによりfind_one_factory_by_id
メソッドが呼び出され、メソッドへの入力として指定されたIDの値と一致する登録IDを備えた唯一のファクトリ・オブジェクトへのリファレンスが取得されます。指定されたIDで複数のファクトリ・オブジェクトが登録されている場合、FactoryFinderのロード・バランシング・スキームに基づき、FactoryFinderはファクトリ・オブジェクトを1つ選択します。その結果、同じIDでfind_one_factory_by_id
操作を複数回呼び出すと、様々なオブジェクト参照が返ることがあります。
find_one_factory_by_id
メソッドは、factory_id
パラメータと同じ値を含むid
フィールド、および値“FactoryInterface"
を含むkind
フィールドを備えた単一のNameComponentが含まれるキーを渡された、find_one_factory
操作と同じように振る舞います。
ファクトリの登録された識別子がfactory_id
パラメータの値と等価であると見なされるのは、単一のNameComponentを含むCosLifeCycle::Key
構造体を構成した結果に、id
フィールドの値としてfactory_id
パラメータが、kind
フィールドの値として“FactoryInterface"
が含まれる場合です。値は、大文字と小文字、場所など、すべての面で一致している必要があります。
ファクトリ・オブジェクトのオブジェクト参照です。C++では、メソッドはCosLifeCycle::Factory
型のオブジェクト参照を返します。Javaでは、メソッドはorg.omg.CORBA.Object
型のオブジェクト参照を返します。
操作が例外を生成した場合には、戻り値は無効であり、呼出し側によって解放される必要はありません。
1つまたは複数のファクトリ・オブジェクト参照のシーケンスを取得します。
virtual CosLifeCycle::Factories *
find_factories_by_id( const char * factory_id) = 0;
public org.omg.CORBA.Object[]
find_factories_by_id( java.lang.String factory_id)
throws
org.omg.CosLifeCycle.NoFactory,
com.beasys.Tobj.CannotProceed,
com.beasys.Tobj.RegistrarNotAvailable;
factory_id
factory_id
パラメータの値は、ファクトリ・オブジェクトに対する登録済リファレンスと対比したときに値が“FactoryInterface"
となっている、kind
フィールドを備えるNameComponentの、id
フィールドの値として使用されます。
CORBA::BAD_PARAM
factory_key
に指定された値が存在しないか、NULL値であった場合に発生するということです。
CosLifeCycle::NoFactory
Tobj::CannotProceed
Tobj::RegistrarNotAvailable
アプリケーションによってfind_factories_by_id
メソッドが呼び出され、1つまたは複数のファクトリ・オブジェクト参照のシーケンスが取得されます。メソッドには、探しているファクトリの識別子が含まれた、NULLで終了する文字列が渡されます。指定したIDで登録されたファクトリ・オブジェクトが複数存在した場合、FactoryFinderは一致する登録済オブジェクトのオブジェクト参照のリストを返します。
find_factories_by_id
メソッドは、factory_id
パラメータと同じ値を含むid
フィールドおよび値“FactoryInterface"
を含むkind
フィールドを備えた単一のNameComponentが含まれるキーを渡された、find_factory
操作と同じように振る舞います。
ファクトリの登録された識別子がfactory_id
パラメータの値と等価であると見なされるのは、単一のNameComponentを含むCosLifeCycle::Key
構造体を構成した結果に、id
フィールドの値としてfactory_id
パラメータが、kind
フィールドの値として“FactoryInterface"
が含まれる場合です。値は、大文字と小文字、場所など、すべての面で一致している必要があります。
factory_key
パラメータの値として指定された情報に一致する、ファクトリ・オブジェクトへのリファレンスの無制限シーケンスです。C++では、メソッドはCosLifeCycle::Factory
型のオブジェクト参照のシーケンスを返します。Javaでは、メソッドはorg.omg.CORBA.Object
型のオブジェクト参照の無制限配列を返します。
操作が例外を生成した場合には、戻り値は無効であり、呼出し側によって解放される必要はありません。
現在FactoryFinderで登録されているファクトリ・オブジェクトのリストを取得します。
virtual FactoryListing * list_factories() = 0;
public com.beasys.Tobj.FactoryComponent[] list_factories()
throws
com.beasys.Tobj.CannotProceed,
com.beasys.Tobj.RegistrarNotAvailable;
Tobj::CannotProceed
Tobj::RegistrarNotAvailable
アプリケーションによってlist_factories
メソッドが呼び出され、FactoryFinderで現在登録されているファクトリ・オブジェクトのリストが取得されます。メソッドは、ファクトリの登録に使用されるキーと、ファクトリ・オブジェクトへのリファレンスの両方を返します。
list_factories
によって返されるファクトリの数は、ユーザーが登録したファクトリの数と同じです。たとえば、ユーザーが4つのファクトリを登録している場合、list_factories
で返されるファクトリ数は5になります。
注: | 原因は、OMGトランザクション・サービス仕様バージョン1.1のセクション2.1.2で、トランザクション・ファクトリの検索がライフ・サイクル・サービスのFactoryFinderインタフェースを使用して行われるように規定されているからです。したがって、トランザクション・ファクトリはFactoryFinderを使用して製品によって内部で登録されます。 |
Tobj::FactoryComponent
の無制限シーケンスです。シーケンス中のTobj::FactoryComponent
の各オカレンスには、登録されたファクトリ・オブジェクトへのリファレンス、およびそのファクトリ・オブジェクトの登録に使用されたCosLifeCycle::Key
が含まれます。
操作が例外を生成した場合には、戻り値は無効であり、呼出し側によって解放される必要はありません。
ここでは、DITobj_FactoryFinderオートメーション・メソッドについて説明します。
HRESULT find_one_factory(
[in] VARIANT factory_key,
[in,out,optional] VARIANT* exceptionInfo,
[out,retval] IDispatch** returnValue);
Function find_one_factory(factory_key, [exceptionInfo]) As Object
factory_key
exceptionInfo
NoFactory
CannotProceed
ULOG
)に書き込まれます。この例外が発生した場合は、すぐに作業担当者に通知してください。内部エラーの重大度によっては、FactoryFinderまたはCORBAサービス・ネーミング・サービスが実行されていたサーバーが、終了していることがあります。FactoryFinderサービスが終了した場合は、新しいFactoryFinderサービスを開始します。CORBAサービス・ネーミング・サービスの1つが終了しており、別のCORBAサービス・ネーミング・サービスが実行中である場合は、新規のCORBAサービス・ネーミング・サービスを開始します。稼働中のネーミング・サービス・サーバーがない場合は、アプリケーションを再起動します。
RegistrarNotAvailable
このメンバー関数は、入力されたfactory_key
にキーが一致する1つのアプリケーション・ファクトリ・オブジェクト参照をFactoryFinderで返すように指示します。これを実現するには、メンバー関数が等価性の照合を行う必要があります。つまり、入力factory_key
のすべてのNameComponent <id, kind>ペアが、アプリケーション・ファクトリのキーの各<id, kind>ペアと完全に一致していなければなりません。入力されたfactory_key
を含むファクトリ・キーが複数存在する場合、FactoryFinderは内部で定義されたロード・バランシング・スキームに基づき、1つのファクトリ・キーを選択します。同じid
でfind_one_factory
を複数回呼び出すと、様々なオブジェクト参照が返ることがあります。
アプリケーション・ファクトリのインタフェース・ポインタへのリファレンスを返します。
HRESULT find_one_factory_by_id(
[in] BSTR factory_id,
[in,out,optional] VARIANT* exceptionInfo,
[out,retval] IDispatch** returnValue);
Function find_one_factory_by_id(factory_id As String,
[exceptionInfo]) As Object
factory_id
exceptionInfo
NoFactory
CannotProceed
ULOG
)に書き込まれます。この例外が発生した場合は、すぐに作業担当者に通知してください。内部エラーの重大度によっては、FactoryFinderまたはCORBAサービス・ネーミング・サービスが実行されていたサーバーが、終了していることがあります。FactoryFinderサービスが終了した場合は、新しいFactoryFinderサービスを開始します。CORBAサービス・ネーミング・サービスの1つが終了しており、別のCORBAサービス・ネーミング・サービスが実行中である場合は、新規のCORBAサービス・ネーミング・サービスを開始します。稼動中のネーミング・サービスがない場合は、アプリケーションを再起動します。
RegistrarNotAvailable
このメンバー関数は、メソッドの入力factory_id
にキーのid
が一致する1つのアプリケーション・ファクトリ・オブジェクト参照をFactoryFinderで戻すように指示します。これを実現するには、メンバー関数が等価性の照合を行う必要があります(つまり、入力されたfactory_id
が、アプリケーション・ファクトリのキーの<id,kind>ペアのid
と完全に一致している必要があります。入力されたfactory_id
を含むファクトリ・キーが複数存在する場合、FactoryFinderは内部で定義されたロード・バランシング・スキームに基づいて1つのファクトリ・キーを選択します。同じid
でfind_one_factory_by_id
を複数回呼び出すと、様々なオブジェクト参照が戻されることがあります。
アプリケーション・ファクトリのインタフェース・ポインタへのリファレンスを返します。
HRESULT find_factories_by_id(
[in] BSTR factory_id,
[in,out,optional] VARIANT* exceptionInfo,
[out,retval] VARIANT* returnValue);
Function find_factories_by_id(factory_id As String,
[exceptionInfo])
factory_id
exceptionInfo
NoFactory
CannotProceed
ULOG
)に書き込まれます。この例外が発生した場合は、すぐに作業担当者に通知してください。内部エラーの重大度によっては、FactoryFinderまたはCORBAサービス・ネーミング・サービスが実行されていたサーバーが、終了していることがあります。FactoryFinderサービスが終了した場合は、新しいFactoryFinderサービスを開始します。CORBAサービス・ネーミング・サービスの1つが終了しており、別のCORBAサービス・ネーミング・サービスが実行中である場合は、新規のCORBAサービス・ネーミング・サービスを開始します。稼働中のネーミング・サービス・サーバーがない場合は、アプリケーションを再起動します。
RegistrarNotAvailable
このメンバー関数は、メソッドの入力factory_id
にキーのid
が一致するアプリケーション・ファクトリ・オブジェクト参照のリストをFactoryFinderで戻すように指示します。これを実現するには、メンバー関数が等価性の照合を行う必要があります(つまり、入力factory_id
が、アプリケーション・ファクトリのキーの<id,kind>ペアの各id
と完全に一致している必要があります)。
アプリケーション・ファクトリへのインタフェース・ポインタの配列を含むバリアントを返します。
HRESULT find_factories(
[in] VARIANT factory_key,
[in,out,optional] VARIANT* exceptionInfo,
[out,retval] VARIANT* returnValue);
Function find_factories(factory_key, [exceptionInfo])
factory_key
NoFactory
find_factories
メソッドは、キーがメソッドの入力キーと一致するサーバー・アプリケーション・ファクトリ・オブジェクト参照のリストを戻すように、FactoryFinderに指示します。Oracle Tuxedoシステムでは、等価性の照合が行われることを想定しています。つまり、<id,kind>ペアの2つのシーケンス(入力キーに対応するものと、アプリケーション・ファクトリのキーに含まれるもの)のそれぞれが同じ長さであり、一方のシーケンスにあるペアはすべて、もう一方のペアにも同一のものが存在します。
アプリケーション・ファクトリへのインタフェース・ポインタの配列を含むバリアントを返します。
アプリケーション・ファクトリ名とオブジェクト参照をすべてリストします。
HRESULT list_factories(
[in,out,optional] VARIANT* exceptionInfo,
[out,retval] VARIANT* returnValue);
Function list_factories([exceptionInfo])
exceptionInfo
CannotProceed
ULOG
)に書き込まれます。この例外が発生した場合は、すぐに作業担当者に通知してください。内部エラーの重大度によっては、FactoryFinderまたはCORBAサービス・ネーミング・サービスが実行されていたサーバーが、終了していることがあります。FactoryFinderサービスが終了した場合は、新しいFactoryFinderサービスを開始します。CORBAサービス・ネーミング・サービスの1つが終了しており、別のCORBAサービス・ネーミング・サービスが実行中である場合は、新規のCORBAサービス・ネーミング・サービスを開始します。稼動中のネーミング・サービス・サーバーがない場合は、アプリケーションを再起動します。
RegistrarNotAvailable
このメソッドは、CORBAサービス・ネーミング・サービスで登録されているアプリケーション・ファクトリのファクトリ・キー、および関連するオブジェクト参照をすべて含むリストを返すよう、FactoryFinderに指示します。
DITobj_FactoryComponentオブジェクトの配列を含むバリアントを返します。FactoryComponentオブジェクトは、DICosNaming_NameComponentオブジェクトの配列と、アプリケーション・ファクトリへのインタフェース・ポインタを含むバリアントで構成されます。
このセクションでは、FactoryFinderインタフェースを使用してプログラミングを行う方法について説明します。
注: | コード内の例外を確認するよう留意してください。 |
ファクトリ・オブジェクトへのリファレンスを見つけるには、プログラマはFactoryFinderオブジェクトを使用します。FactoryFinderオブジェクトは、指定した基準に基づき、ファクトリ・オブジェクトへの1つまたは複数のリファレンスを取得する操作を提供します。
プロセス・アドレス領域には、複数のFactoryFinderオブジェクトが存在できます。FactoryFinderオブジェクトへの複数リファレンスをサポートする必要があります。FactoryFinderオブジェクトは、ドメイン内のFactoryFinderオブジェクトと、ドメインへのアクセスに使用する特定のIIOPサーバー・リスナー/ハンドラ(ISL/ISH)の間の関連付けについての状態を維持するという点では、セミ・ステートフル・オブジェクトです。
Object Management GroupのCORBAサービス仕様(1997年12月)の第6章「Life Cycle Service」で定義されているように、FactoryFinderオブジェクトはすべてCosLifeCycle::FactoryFinder
インタフェースをサポートしています。このインタフェースは、指定した基準に合致するファクトリ・オブジェクトへの1つまたは複数のリファレンスを取得するために使用される操作を1つ含みます。
次のコードの抜粋(リスト5-8)では、TPフレームワーク・インタフェースを使用して、FactoryFinderでファクトリ・オブジェクトへのリファレンスを登録する方法を示します。
// Server Application: Registering a factory.
// C++ Example.
TP::register_factory( factory_obj.in( ), “TellerFactory" );
次のコードの抜粋(リスト5-9)は、CORBA準拠のインタフェースを使用してファクトリ・オブジェクトへの1つまたは複数のリファレンスを取得する方法を示します。
// Client Application: Obtaining the object reference
// to factory objects.
CosLifeCycle::Key_var factory_key = new CosLifeCycle::Key( );
factory_key ->length(1);
factory_key[0].id = string_dupalloc( “strlen(“TellerFactory") +1 );
factory_key[0].kind = string_dupalloc(
strlen(““FactoryInterface") + 1);
strcpy( factory_key[0].id, “"TellerFactory" );
strcpy( facory_key[0].kind, “FactoryInterface" );
CosLifeCycle::Factories_var * flp = ff_np ->
find_factories( factory_key.in( ) );
次のコードの抜粋(リスト5-10)は、Oracle Tuxedo拡張Bootstrapオブジェクトを使用してFactoryFinderオブジェクトへのリファレンスを取得する方法を示したものです。
// Client Application: Finding one factory using the Tobj
// approach.
Tobj_Bootstrap * bsp = new Tobj_Bootstrap(
orb_ptr.in( ), host_port );
CORBA::Object_varptr ff_op = bsp ->
resolve_initial_references( “FactoryFinder” );
Tobj::FactoryFinder_ptrvar ff_np =
Tobj::FactoryFinder::_narrow( ff_op);
注: | Tobj_Bootstrapオブジェクトを使用する場合は、CosLifeCycle::FactoryFinder インタフェースにOracle Tuxedo CORBAの拡張を使用できますが、このオブジェクトはファクトリを見つけるために必須のものではありません。CORBA INSを使用していれば、CosLifeCycle::FactoryFinder インタフェースにより提供されるfind_factories() メソッドを使用できます。 |
Oracle Tuxedoでは、CORBAで定義される操作と類似の機能をサポートするように、FactoryFinderオブジェクトを拡張します。ただしこちらでは、大幅に簡素化されており、より限定的であるシグネチャが使われます。拡張機能は、Tobj::FactoryFinder
インタフェースを定義することによって提供されます。Tobj::FactoryFinder
インタフェース用に定義された操作は、CORBAで定義される同等の機能を、焦点を絞って簡素化した形態で提供することを意図しています。アプリケーション開発者は、開発時に、CORBA定義の拡張を使用するか、Oracle Tuxedoの拡張を使用するかを選択できます。インタフェースTobj::FactoryFinder
は、CosLifeCycle::FactoryFinder
インタフェースから派生しています。
FactoryFinderオブジェクトへのOracle Tuxedoの拡張は、Object Management GroupのCORBAサービス仕様(1997年12月)の第6章「Life Cycle Service」で定義されているFactoryFinderオブジェクトとすべて同じ規則に準拠しています。
拡張されたFactoryFinderオブジェクトの実装では、ユーザーがCORBA定義のCosLifeCycle::FactoryFinder
インタフェースでのようにCosLifeCycle::Key
を指定するか、または探しているファクトリ・オブジェクトの識別子を含んだNULLで終了する文字列を指定する必要があります。
次のコードの抜粋(リスト5-11)では、Oracle Tuxedo拡張インタフェースを使用して、識別子に基づき、ファクトリ・オブジェクトへのリファレンスを1つ取得する方法を示します。
CosLifeCycle::Factory_ptrvar fp_obj = ff_np ->
find_one_factory_by_id( “TellerFactory” );
次のコードの抜粋(リスト5-12)では、Oracle Tuxedo拡張を使用して、識別子に基づき、ファクトリ・オブジェクトへの1つまたは複数のリファレンスを取得する方法を示します。
CosLifeCycle::Factories * _var flp = ff_np ->
find_factories_by_id( “TellerFactory” );