|
この章では、C++ と拡張 C++ でのコア メンバー関数の Oracle Tuxedo 実装について説明します。また、擬似オブジェクトとその C++ クラスとの関係についても説明します。擬似オブジェクトとは、ネットワーク経由で転送不可能なオブジェクト参照のことです。擬似オブジェクトはその他のオブジェクトと似ていますが、ORB によって所有されるため拡張ができません。
注意 : | この章の一部の情報は、Object Management Group (OMG) の「Common Object Request Broker: Architecture and Specification, Revision 2.4.2」(2001 年 2 月) から転載しています。使用にあたっては OMG の許可を得ています。 |
注意 : | Oracle Tuxedo CORBA Java クライアントと Oracle Tuxedo CORBA Java クライアント ORB は Tuxedo 8.1 で非推奨になり、Tuxedo 9.x ではサポートされなくなりました。Oracle Tuxedo CORBA Java クライアントと Oracle Tuxedo CORBA Java クライアント ORB のすべてのテキスト リファレンスや関連するサンプル コードは、以下の場合にのみ使用してください。 |
注意 : | サード パーティの CORBA Java ORB のテクニカル サポートは、各ベンダによって提供されます。Oracle Tuxedo では、サード パーティの CORBA Java ORB に関する技術的なサポートやマニュアルは提供していません。 |
次の Oracle Tuxedo クラスは、スコープ内においてグローバルです。
上記のクラスには、Oracle Tuxedo の開発で使用する定義済みの型、クラス、および関数が含まれています。
CORBA クラスには、CORBA で定義されている、オブジェクト リクエスト ブローカ (ORB) を使用する際に不可欠なクラス、データ型、およびメンバー関数があります。Oracle Tuxedo の CORBA への拡張は、Tobj C++ クラスに含まれています。Tobj クラスには、Oracle Tuxedo で CORBA への拡張として用意されているデータ型、ネストされたクラス、およびメンバー関数があります。
Oracle Tuxedo 製品で CORBA のデータ型とメンバー関数を使用するには、CORBA::
接頭辞が必要です。たとえば、Long
の場合は CORBA::Long
となります。同様に、Oracle Tuxedo 製品で Tobj のネストされたクラスとメンバー関数を使用するには、Tobj::
接頭辞が必要です。たとえば、FactoryFinder の場合は Tobj::FactoryFinder
となります。
擬似オブジェクトは、CORBA クラス内部にあるローカル クラスとして表されます。擬似オブジェクトおよび対応するメンバー関数の名前は、ネストされたクラス構造で付けます。たとえば、ORB オブジェクトの場合は CORBA::ORB
、Current オブジェクトの場合は CORBA::Current
となります。
ここでは、Any
クラスの各メンバー関数について説明します。
Any メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA
{
class Any
{
public:
Any ();
Any (const Any&);
Any (TypeCode_ptr tc, void *value, Boolean release =
CORBA_ FALSE);
~Any ();
Any & operator=(const Any&);
void operator<<=(Short);
void operator<<=(UShort);
void operator<<=(Long);
void operator<<=(ULong);
void operator<<=(Float);
void operator<<=(Double);
void operator<<=(const Any&);
void operator<<=(const char*);
void operator<<=(Object_ptr);
void operator<<=(from_boolean);
void operator<<=(from_char);
void operator<<=(from_octet);
void operator<<=(from_string);
Boolean operator>>=(Short&) const;
Boolean operator>>=(UShort&) const;
Boolean operator>>=(Long&) const;
Boolean operator>>=(ULong&) const;
Boolean operator>>=(Float&) const;
Boolean operator>>=(Double&) const;
Boolean operator>>=(Any&) const;
Boolean operator>>=(char*&) const;
Boolean operator>>=(Object_ptr&) const;
Boolean operator>>=(to_boolean) const;
Boolean operator>>=(to_char) const;
Boolean operator>>=(to_octet) const;
Boolean operator>>=(to_object) const;
Boolean operator>>=(to_string) const;
TypeCode_ptr type()const;
void replace(TypeCode_ptr, void *, Boolean);
void replace(TypeCode_ptr, void *);
const void * value() const;
};
}; //CORBA
CORBA::Any::Any()
CORBA::Any
クラスのデフォルトのコンストラクタです。tc_null
型および値 0 (ゼロ) の TypeCode で Any オブジェクトを作成します。
ほかの Any オブジェクトのコピーである Any オブジェクトを作成します。
CORBA::Any::Any(const CORBA::Any & InitAny)
InitAny
CORBA::Any
クラスのコピー コンストラクタです。このコンストラクタは、渡される Any の TypeCode リファレンスを複製します。
コピーする型は、コピー元の Any オブジェクトの release
フラグによって決まります。release
が CORBA_TRUE
と評価された場合、コンストラクタはパラメータの値をディープ コピーします。release
が CORBA_FALSE
と評価された場合、コンストラクタはパラメータの値をシャロー コピーします。シャロー コピーを使用すると、メモリの割り当てをより高度に制御できます。ただし、呼び出し側は、解放済みのメモリを Any が使用していないことを確認する必要があります。
TypeCode および値で Any オブジェクトを作成します。
CORBA::Any::Any(TypeCode_ptr TC, void * Value, Boolean Release)
TC
Value
Release
Value
引数で指定されたメモリの所有権を Any
が想定するかどうかを指定します。Release
が CORBA_TRUE
の場合、Any
は所有権を想定します。Release
が CORBA_FALSE
の場合、Any
は所有権を想定しません。この場合、Value
引数が指すデータは、割り当て時または破棄時に解放されません。
このコンストラクタは、非型保障 Any
インタフェースで使用されます。指定された TypeCode オブジェクト参照を複製してから、Any
オブジェクト内の値が指すデータを挿入します。
CORBA::Any::~Any()
このデストラクタは、Release
フラグが CORBA_TRUE
に指定されている場合に、CORBA::Any
が保持しているメモリを解放します。また、Any
に含まれる TypeCode 擬似オブジェクト参照も解放します。
CORBA::Any & CORBA::Any::operator=(const CORBA::Any & InitAny)
InitAny
Value
でメモリの所有権を想定するかどうかが決まります。Release
が CORBA_TRUE
の場合、Any は所有権を想定して InitAny
引数の値をディープ コピーします。Release
が CORBA_FALSE
の場合、Any は InitAny
引数の値をシャロー コピーします。
これは、Any クラスの代入演算子です。このメンバー関数のメモリ管理は、Release
フラグの現在の値によって決まります。また、Release
フラグの現在の値によって、現在のメモリが割り当て前に解放されるかどうかも決まります。現在の Release
フラグが CORBA_TRUE
の場合、Any は保持していたすべての値を解放します。現在の Release フラグが CORBA_FALSE
の場合、Any は保持していた値を解放しません。
InitAny
のコピーを保持する Any を返します。
void CORBA::Any::operator<<=(CORBA::Short Value)
void CORBA::Any::operator<<=(CORBA::UShort Value)
void CORBA::Any::operator<<=(CORBA::Long Value)
void CORBA::Any::operator<<=(CORBA::Ulong Value)
void CORBA::Any::operator<<=(CORBA::Float Value)
void CORBA::Any::operator<<=(CORBA::Double Value)
void CORBA::Any::operator<<=(const CORBA::Any & Value)
void CORBA::Any::operator<<=(const char * Value)
void CORBA::Any::operator<<=(Object_ptr Value)
Value
この挿入メンバー関数は、型保障挿入を実行します。Any に前の値があり、Release
フラグが CORBA_TRUE
の場合、メモリの割り当てを解除し、前の TypeCode オブジェクトを解放します。次に、Value
パラメータで渡された値をコピーして Any に新しい値を挿入します。これにより、適切な TypeCode リファレンスが複製されます。
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Short & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::UShort & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Long & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Ulong & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Float & Value) const
CORBA::Boolean CORBA::Any::operator>>=(
CORBA::Double & Value) const
CORBA::Boolean CORBA::Any::operator>>=(CORBA::Any & Value) const
CORBA::Boolean CORBA::Any::operator>>=(char * & Value) const
CORBA::Boolean CORBA::Any::operator>>=(Object_ptr & Value) const
Value
引数は、Any オブジェクトに格納されている値の出力を受け取る関連オブジェクトのリファレンスです。
この抽出メンバー関数は、型保障抽出を実行します。Any オブジェクトに指定の型がある場合、このメンバー関数は、Any のポインタを出力リファレンス値 Value
に割り当て、CORBA_TRUE
を返します。Any に適切な型がない場合は、CORBA_FALSE
を返します。ストレージは Any オブジェクトによって所有および管理されているため、呼び出し側はストレージの解放または削除を試行しないでください。Value
引数は、Any オブジェクトに格納されている値の出力を受け取る関連オブジェクトのリファレンスです。Any オブジェクトに適切な型がない場合、値は変更されません。
特定の型の値が Any にあった場合は CORBA_TRUE
。特定の型の値が Any になかった場合は CORBA_FALSE
。
void CORBA::Any::operator<<=(from_boolean Value)
void CORBA::Any::operator<<=(from_char Value)
void CORBA::Any::operator<<=(from_octet Value)
void CORBA::Any::operator<<=(from_string Value)
Value
これらの挿入メンバー関数は、Any に CORBA::Boolean
、CORBA::Char
、または CORBA::Octet
リファレンスを型保障で挿入します。Any に前の値があり、その Release
フラグが CORBA_TRUE
の場合、メモリの割り当てを解除し、前の TypeCode オブジェクトを解放します。次に、Value
パラメータで渡された値をコピーして Any オブジェクトに新しい値を挿入します。これにより、適切な TypeCode リファレンスが複製されます。
CORBA::Boolean CORBA::Any::operator>>=(to_boolean Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_char Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_octet Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_object Value) const
CORBA::Boolean CORBA::Any::operator>>=(to_string Value) const
Value
これらの抽出メンバー関数は、Any から CORBA::Boolean
、CORBA::Char
、CORBA::Octet
、CORBA::Object
、または
String
リファレンスを型保障で抽出します。これらの関数は、Any クラス内でネストされたヘルパーです。その目的は、C++ では Boolean 型、char 型、octet 型の識別が不要なため、OMG IDL のこれらの型を識別して抽出することです。
Any オブジェクトに指定の型がある場合、このメンバー関数は、Any オブジェクト参照の値を出力変数 Value
に割り当て、CORBA_TRUE
を返します。Any オブジェクトに適切な型がない場合は、CORBA_FALSE
を返します。
CORBA::TypeCode_ptr CORBA::Any::type();
この関数は、Any に関連付けられた TypeCode オブジェクトの TypeCode_ptr
擬似オブジェクト参照を返します。TypeCode_ptr
擬似オブジェクト参照は、CORBA::release
メンバー関数で解放する必要があります。または、TypeCode_var
に割り当てて自動的に解放されるようにする必要があります。
void CORBA::Any::replace(TypeCode_ptr TC, void * Value,
Boolean Release = CORBA_FALSE);
TC
Value
Release
Release
が CORBA_TRUE
の場合、Any は所有権を想定します。Release
が CORBA_FALSE
の場合、Any は所有権を想定しません。この場合、Value
パラメータが指すデータは、割り当て時または破棄時に解放されません。
これらのメンバー関数は、渡された TC および Value
引数の値に、現在 Any に格納されているデータおよび TypeCode 値を置き換えます。この関数による置き換えは型保障ではありません。つまり、TypeCode 値と Value
引数が指すストレージのデータ型との一貫性は、呼び出し側が維持することになります。
Release が CORBA_TRUE
の場合、この関数は Any オブジェクト内の既存の TypeCode 擬似オブジェクトを解放し、Any オブジェクト参照が指すストレージを解放します。
Context は、メソッド呼び出しに関連付けられたオプションのコンテキスト情報を提供します。
Context メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA
{
class Context
{
public:
const char *context_name() const;
Context_ptr parent() const;
void create_child(const char *, Context_out);
void set_one_value(const char *, const Any &);
void set_values(NVList_ptr);
void delete_values(const char *);
void get_values(
const char *,
Flags,
const char *,
NVList_out
);
}; // Context
}// CORBA
ここでは、各 Context メンバー関数について説明します。
Const char * CORBA::Context::context_name () const;
このメンバー関数は、Context オブジェクトの名前を返します。Context オブジェクト参照は、戻り値 char * のメモリを所有します。このメモリは変更できません。
メンバー関数が成功した場合、Context オブジェクトの名前を返します。Context オブジェクトが CORBA::Context::create_child
の呼び出しで作成された子 Context でない場合、値は空になることがあります。
Context オブジェクトに名前がない場合、空の文字列になります。
void CORBA::Context::create_child (
const char * CtxName,
CORBA::Context_out CtxObject);
CtxName
CtxObject
このメンバー関数は、Context オブジェクトの子を作成します。子 Context オブジェクトの検索は、一致する親コンテキストのプロパティ名や、必要に応じてコンテキスト ツリーなどを対象に行われます。
CORBA::ORB::get_default_context
CORBA::release
Context オブジェクトの指定された属性の値を削除します。
void CORBA::Context::delete_values (
const char * AttrName);
AttrName
属性が空の文字列の場合、CORBA::BAD_PARAM
。
削除する属性が見つからなかった場合、CORBA::BAD_CONTEXT
。
このメンバー関数は、Context オブジェクトの属性の名前付きの値を削除します。ただし、親がある場合、再帰的に親に対して同じ処理は行いません。
CORBA::Context::create_child
CORBA::ORB::get_default_context
指定されたスコープ内で Context オブジェクトの属性値を取り出します。
void CORBA::Context::get_values (
const char * StartScope,
CORBA::Flags OpFlags,
const char * AttrName,
CORBA::NVList_out AttrValues);
StartScope
parent
です。値が 0 (ゼロ) の場合、現在の Context オブジェクトで検索が開始されます。
OpFlags
CORBA::CTX_RESTRICT_SCOPE
のみです。このフラグを指定すると、オブジェクト実装によってプロパティの検索が現在のスコープのみに制限されます。したがって、一連の親コンテキストのプロパティの検索は再帰的に実行されません。このフラグを指定しない場合は、スコープを広げて一致が見つかるか、または検索対象がすべてのレベルになるまで検索が続行されます。
AttrName
AttrValues
属性が空の文字列の場合、CORBA::BAD_PARAM
。
一致する属性が見つからなかった場合、CORBA::BAD_CONTEXT
。
動的メモリ割り当てに失敗した場合、CORBA::NO_MEMORY
。
このメンバー関数は、Context オブジェクトの指定された属性の値を取り出します。値は NVList オブジェクトとして返します。このオブジェクトが不要になったときは、CORBA::release
メンバー関数を使用して解放する必要があります。
CORBA::Context::create_child
CORBA::ORB::get_default_context
CORBA::Context_ptr CORBA::Context::parent () const;
このメンバー関数は、Context オブジェクトの親コンテキストを返します。Context オブジェクトの親は Context が所有する属性で、呼び出し側が変更または解放することはできません。CORBA::Context::create_child
メンバー関数で Context オブジェクトを作成するまで、親は nil です。
メンバー関数が成功した場合、Context オブジェクトの親コンテキストを返します。親コンテキストが nil の場合もあります。CORBA::is_nil
メンバー関数を使用すると、オブジェクト参照が nil かどうかをテストできます。
メンバー関数が失敗した場合、例外が送出されます。CORBA::is_nil
メンバー関数を使用すると、オブジェクト参照が nil かどうかをテストできます。
void CORBA::Context::set_one_value (
const char * AttrName,
const CORBA::Any & AttrValue);
AttrName
AttrValue
AttrName
が空の文字列の場合、または AttrValue
に文字列型がない場合、CORBA::BAD_PARAM
。
動的メモリ割り当てに失敗した場合、CORBA::NO_MEMORY
。
このメンバー関数は、Context オブジェクトの指定された属性値を設定します。現在、Context オブジェクトでサポートされているのは文字列値のみです。Context オブジェクトに属性名が設定済みの場合、最初にその属性名が削除されます。
CORBA::Context::get_values
CORBA::Context::set_values
void CORBA::Context::set_values (
CORBA::NVList_ptr AttrValue);
AttrValues
CORBA::Any
オブジェクト内で文字列型で指定する必要があります。
属性値の中に文字列型でない値がある場合、CORBA::BAD_PARAM
。
動的メモリ割り当てに失敗した場合、CORBA::NO_MEMORY
。
このメンバー関数は、Context オブジェクトの指定の属性値を設定します。CORBA::NVList
メンバー関数には、設定するプロパティの名前と値のペアが入ります。
CORBA::Context::get_values
CORBA::Context::set_one_value
ContextList を使用すると、クライアント アプリケーションまたはサーバ アプリケーションでコンテキスト文字列のリストを提供できるようになります。このリストは、Request 呼び出しで指定する必要があります。Request メンバー関数については、「Request メンバー関数」を参照してください。
ContextList と Context は、前者が必要に応じて Request 呼び出しで検索または送信されるコンテキスト文字列値のみを提供するのに対し、後者は取得する文字列値を提供する点で異なります。Context メンバー関数については、「Context メンバー関数」を参照してください。
ContextList メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA
{
class ContextList
{
public:
Ulong count ();
void add(const char* ctxt);
void add_consume(char* ctxt);
const char* item(Ulong index);
Status remove(Ulong index);
}; // ContextList
}// CORBA
Ulong count ();
関数が成功した場合、戻り値はリスト内の項目数です。リストを作成したばかりで、ContextList オブジェクトを追加していない場合は、0 (ゼロ) が返されます。
CORBA::ContextList::add
CORBA::ContextList::add_consume
CORBA::ContextList::item
CORBA::ContextList::remove
名前の付いていない項目で ContextList オブジェクトを作成します。これは、flags
属性のみを設定したオブジェクトです。
void add(const char* ctxt);
ctxt
メンバー関数が失敗した場合、CORBA::NO_MEMORY
例外が送出されます。
このメンバー関数は、名前の付いていない項目で ContextList オブジェクトを作成します。これは、flags 属性のみを設定したオブジェクトです。
ContextList オブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要がありません。
関数が成功した場合、戻り値は新しく作成された ContextList オブジェクトへのポインタです。
CORBA::ContextList::add_consume
CORBA::ContextList::count
CORBA::ContextList::item
CORBA::ContextList::remove
void add_consume(const char* ctxt);
このメンバー関数は、ContextList オブジェクトを作成します。
ContextList オブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要がありません。
関数が成功した場合、戻り値は新しく作成された ContextList オブジェクトへのポインタです。
CORBA::ContextList::add
CORBA::ContextList::count
CORBA::ContextList::item
CORBA::ContextList::remove
渡されたインデックスに基づいて ContextList オブジェクトへのポインタを取り出します。
const char* item(ULong index);
index
この関数が失敗した場合、BAD_PARAM
例外が送出されます。
このメンバー関数は、渡されたインデックスに基づいて ContextList オブジェクトへのポインタを取り出します。関数では、ゼロを基数にしたインデックスを使用します。
関数が成功した場合、戻り値は ContextList オブジェクトへのポインタです。
CORBA::ContextList::add
CORBA::ContextList::add_consume
CORBA::ContextList::count
CORBA::ContextList::remove
指定されたインデックスの項目を削除し、関連付けられたメモリをすべて解放してから、リストの残りの項目を順序付けし直します。
Status remove(ULong index);
Index
この関数が失敗した場合、BAD_PARAM
例外が送出されます。
このメンバー関数は、指定されたインデックスの項目を削除し、関連付けられたメモリをすべて解放してから、リストの残りの項目を順序付けし直します。
CORBA::ContextList::add
CORBA::ContextList::add_consume
CORBA::ContextList::count
CORBA::ContextList::item
NamedValue メンバー関数は、特に DII で NVList の要素としてのみ使用します。NamedValue は、(省略可能な) 名前、any
の値、およびラベリング フラグを保持します。有効なフラグ値は、CORBA::ARG_IN
、CORBA::ARG_OUT
、および CORBA::ARG_INOUT
です。
NamedValue の値は、any
の標準オペレーションで操作できます。
NamedValue メンバー関数の C++ へのマッピングは次のとおりです。
// C++
class NamedValue
{
public:
Flags flags() const;
const char * name() const;
Any * value() const;
};
NamedValue には、次の特別なメモリ管理規則があります。
以下のセクションでは、NamedValue の各メンバー関数について説明します。
NamedValue オブジェクトの flags 属性を取り出します。
CORBA::Flags CORBA::NamedValue::flags () const;
このメンバー関数は、NamedValue オブジェクトの flags 属性を取り出します。
関数が成功した場合、戻り値は NamedValue オブジェクトの flags 属性です。
NamedValue オブジェクトの name 属性を取り出します。
const char * CORBA::NamedValue::name () const;
このメンバー関数は、NamedValue オブジェクトの name 属性を取り出します。このメンバー関数が返す名前は NamedValue オブジェクトによって所有されます。そのため、変更または解放しないでください。
関数が成功した場合、戻り値は NamedValue オブジェクトの name 属性を表す定数 Identifier オブジェクトです。
NamedValue オブジェクトの value 属性へのポインタを取り出します。
CORBA::Any * CORBA::NamedValue::value () const;
このメンバー関数は、NamedValue オブジェクトの value 属性を表す Any オブジェクトへのポインタを取り出します。この属性は NamedValue オブジェクトによって所有されます。そのため、変更または解放しないでください。
関数が成功した場合、戻り値は NamedValue オブジェクト内にある Any オブジェクトへのポインタです。
NVList は NamedValue のリストです。新しい NVList は、ORB::create_list
オペレーション (「CORBA::ORB::create_exception_list」を参照) で作成します。新しい NamedValue は、次のいずれかの方法で NVList の一部として作成できます。
要素は、ゼロを基数にしたインデックスを介してアクセスおよび削除できます。add
、add_item
、add_value
、add_item_consume
、および add_value_consume
関数は、呼び出されるたびに NVList
を長くして新しい要素を保持できるようにします。既存の要素にアクセスするには、item
関数を使用します。
// C++
class NVList
{
public:
ULong count() const;
NamedValue_ptr add(Flags);
NamedValue_ptr add_item(const char*, Flags);
NamedValue_ptr add_value(const char*, const Any&, Flags);
NamedValue_ptr item(ULong);
void remove(ULong);
};
add
、add_item
、add_value
、add_item_consume
、add_value_consume
、および item
関数の戻り値の所有権は NVList が保持します。したがって、呼び出し側はこれらの戻り値を解放しないでください。add_item_consume
と add_value_consume
関数の char*
パラメータ、および add_value_consume
関数の Any*
パラメータは、NVList が使用します。NVList はこれらのパラメータをコピーして、元のパラメータをすぐに破棄します。そのため、パラメータが関数に渡された後は、呼び出し側がこれらのデータにアクセスすることはできません。基底の NamedValue の value
属性を呼び出し側が変更する場合は、NamedValue::value()
オペレーションを使用します。remove
関数は、削除済みの NamedValue の CORBA::release
も呼び出します。
以下のセクションでは、NVList の各メンバー関数について説明します。
名前の付いていない項目で NamedValue オブジェクトを作成します。これは、flags
属性のみを設定したオブジェクトです。
CORBA::NamedValue_ptr CORBA::NVList::add (
CORBA::Flags Flags);
Flags
このメンバー関数は、名前の付いていない項目で NamedValue オブジェクトを作成します。これは、flags 属性のみを設定したオブジェクトです。NamedValue オブジェクトは、呼び出された NVList オブジェクトに追加されます。
NVList オブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成された NamedValue オブジェクトへのポインタです。返された NamedValue オブジェクト参照は NVList が所有するため、解放しないでください。
メンバー関数が失敗した場合、CORBA::NO_MEMORY
例外が送出されます。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::remove
空の value 属性を作成し、name および flags 属性を初期化して NamedValue オブジェクトを作成します。
CORBA::NamedValue_ptr CORBA::NVList::add_item (
const char * Name,
CORBA::Flags Flags);
Name
Flags
このメンバー関数は、空の value 属性を作成し、パラメータとして渡す name および flags 属性を初期化して NamedValue オブジェクトを作成します。NamedValue オブジェクトは、呼び出された NVList オブジェクトに追加されます。
NVList オブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成された NamedValue オブジェクトへのポインタです。返された NamedValue オブジェクト参照は NVList が所有するため、解放しないでください。
CORBA::NVList::add
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::item
CORBA::NVList::remove
name、value、および flags 属性を初期化して NamedValue オブジェクトを作成します。
CORBA::NamedValue_ptr CORBA::NVList::add_value (
const char * Name,
const CORBA::Any & Value,
CORBA::Flags Flags);
Name
Value
Flags
このメンバー関数は、name、value、および flags 属性を初期化して NamedValue オブジェクトを作成します。NamedValue オブジェクトは、呼び出された NVList オブジェクトに追加されます。
NVList オブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成された NamedValue オブジェクトへのポインタです。返された NamedValue オブジェクト参照は NVList が所有するため、解放しないでください。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::count
CORBA::NVList::item
CORBA::NVList::remove
CORBA::ULong CORBA::NVList::count () const;
関数が成功した場合、戻り値はリスト内の項目数です。リストを作成したばかりで、NamedValue オブジェクトを追加していない場合は、0 (ゼロ) が返されます。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::item
CORBA::NVList::remove
渡されたインデックスに基づいて NamedValue オブジェクトへのポインタを取り出します。
CORBA::NamedValue_ptr CORBA::NVList::item (
CORBA::ULong Index);
Index
この関数が失敗した場合、BAD_PARAM
例外が送出されます。
このメンバー関数は、渡されたインデックスに基づいて NamedValue オブジェクトへのポインタを取り出します。関数では、ゼロを基数にしたインデックスを使用します。
関数が成功した場合、戻り値は NamedValue オブジェクトへのポインタです。返された NamedValue オブジェクト参照は NVList が所有するため、解放しないでください。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::remove
指定されたインデックスの項目を削除し、関連付けられたメモリをすべて解放してから、リストの残りの項目を順序付けし直します。
void CORBA::NVList::remove (
CORBA::ULong Index);
Index
この関数が失敗した場合、BAD_PARAM
例外が送出されます。
このメンバー関数は、指定されたインデックスの項目を削除し、関連付けられたメモリをすべて解放してから、リストの残りの項目を順序付けし直します。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::NVList::count
CORBA::NVList::item
ここでは、OMG IDL インタフェースの Object に適用される規則について説明します。Object は、OMG IDL インタフェース階層の基底インタフェースです。インタフェース Object では、擬似オブジェクトではなく通常の CORBA オブジェクトを定義します。ただし、ここではほかの擬似オブジェクトも参照するため、これについても触れています。
ほかの規則に加えて、インタフェース Object のオペレーション名はすべて、マッピングされる C++ クラスの先頭にアンダースコアが付きます。また、create_request
のマッピングは 3 つに分類されます。これらは、「Request メンバー関数」で説明した方式にそれぞれ対応しています。is_nil
および release
関数については、「Object メンバー関数」で説明する CORBA ネームスペースを参照してください。
Oracle Tuxedo ソフトウェアでは、CORBA Revision 2.2 で定義されているオブジェクト参照オペレーションを使用しています。これらのオペレーションが依存するのは、型 Object
のみです。したがって、オペレーションは CORBA ネームスペースの中で通常の関数として記述できます。
注意 : | Oracle Tuxedo ソフトウェアでは、BOA ではなく POA を使用しているため、非推奨の get_implementation() メンバー関数は認識されません。このメンバー関数を参照しようとすると、コンパイル エラーが発生します。 |
Object メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA
ExceptionList_ptr Except_list,
{
class Object
{
public:
CORBA::Boolean _is_a(const char *)
CORBA::Boolean _is_equivalent();
CORBA::Boolean _nonexistent(Object_ptr);
static Object_ptr _duplicate(Object_ptr obj);
static Object_ptr _nil();
InterfaceDef_ptr _get_interface();
CORBA::ULong _hass(CORBA::ULong);
void _create_request(
Context_ptr ctx,
const char *operation,
NVList_ptr arg_list,
NamedValue_ptr result,
Request_out request,
Flags req_flags
);
Status _create_request(
Context_ptr ctx,
const char * operation,
NVList_ptr arg_list,
NamedValue_ptr result,
ContextList_ptr Context_list,Request_out request,
Flags req_flags
);
Request_ptr _request(const char* operation);
}; //Object
}; // CORBA
以下のセクションでは、Object
の各メンバー関数について説明します。
Void CORBA::Object::_create_request (
CORBA::Context_ptr Ctx,
const char * Operation,
CORBA::NVList_ptr Arg_list,
CORBA::NamedValue_ptr Result,
CORBA::ExceptionList_ptr Except_list,
CORBA::ContextList_ptr Context_list,
CORBA::Request_out Request,
CORBA::Flags Req_flags,);
Ctx
Operation
Arg_list
Result
Except_list
Context_list
Request
Req_flags
このメンバー関数は、コンテキスト、オペレーション名、およびその他の情報を提供する要求を作成します (長い形式)。呼び出し時に指定したオペレーション名だけで要求を作成する (短縮形式) には、CORBA::Object::_request
メンバー関数を使用します。ただし、長い形式で提供される残りの情報については、最終的には指定する必要があります。
CORBA::Object_ptr CORBA::Object::_duplicate(
Object_ptr Obj);
obj
このメンバー関数は、指定の Object オブジェクト参照 (Obj
) を複製します。指定のオブジェクト参照が nil の場合、_duplicate
関数は nil オブジェクト参照を返します。この呼び出しで返されるオブジェクトは、CORBA::release
で解放するか、または自動的に破棄されるように CORBA::Object_var
を割り当てる必要があります。
この関数では、CORBA システム例外が送出される場合があります。
複製オブジェクト参照を返します。指定のオブジェクト参照が nil の場合は、nil オブジェクト参照を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0","MyTeller");
CORBA::Object_ptr dop = CORBA::Object::_duplicate(op);
Repository オブジェクトのインタフェース定義を返します。
CORBA::InterfaceDef_ptr CORBA::Object::_get_interface ();
Repository オブジェクトのインタフェース定義を返します。
注意 : | リポジトリ インタフェース API を使用するには、マクロを定義してから CORBA.h をインクルードします。マクロの定義方法については、『Tuxedo CORBA サーバ アプリケーションの開発方法』を参照してください。 |
オブジェクトが特定のインタフェースのインスタンスであるかどうかを指定します。
CORBA::Boolean CORBA::Object::_is_a(const char * interface_id);
interface_id
このメンバー関数は、オブジェクトが interface_id
パラメータで指定されたインタフェースのインスタンスであるかどうかを指定するために使用します。この関数を使用すると、ORB のスコープでオブジェクト参照の型保障の維持が容易になります。
オブジェクトが指定の型のインスタンスである場合、またはオブジェクトがそのオブジェクトの「最終派生」型の上位オブジェクトである場合、TRUE
を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::Boolean b = op->_is_a("IDL:Teller:1.0");
CORBA::Boolean CORBA::Object::_is_equivalent (
CORBA::Object_ptr other_obj);
other_obj
このメンバー関数は、2 つのオブジェクト参照が等価であるかどうかを判別するために使用します。これにより、ORB での判別が容易になります。この関数では、一方のオブジェクト参照が、パラメータとして渡されたオブジェクト参照と等価である場合、TRUE
を返します。2 つのオブジェクト参照が同じ場合、両者は等価です。2 つのオブジェクト参照が異なっても、同一のオブジェクトを参照していれば、両者は等価です。
対象のオブジェクト参照が、パラメータとして渡された他方のオブジェクト参照と等価であると認識された場合、TRUE
を返します。それ以外の場合は、FALSE
を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::Object_ptr dop = CORBA::Object::_duplicate(op);
CORBA::Boolean b = op->_is_equivalent(dop);
CORBA::Object_ptr CORBA::Object::_nil();
このメンバー関数は、nil オブジェクト参照を返します。指定のオブジェクトが nil であるかどうかをテストするには、適切な CORBA::is_nil
メンバー関数を使用します。この関数については、「CORBA::release」を参照してください。_nil
メンバー関数の CORBA:is_nil
ルーチンを呼び出すと、常に CORBA_TRUE
が返されます。
CORBA::Object_ptr op = CORBA::Object::_nil();
オブジェクトが破棄されているかどうかを判別するために使用します。
CORBA::Boolean CORBA::Object::_non_existent();
このメンバー関数は、オブジェクトが破棄されているかどうかを判別するために使用します。この関数では、オブジェクトのアプリケーション レベルのオペレーションを呼び出さずに判別を行うので、オブジェクト自体に影響は生じません。
ORB で正式にオブジェクトが存在しないことが認識された場合、CORBA::OBJECT_NOT_EXIST
を引き起こさずに CORBA_TRUE
を返します。それ以外の場合は、CORBA_FALSE
を返します。
CORBA::Request_ptr CORBA::Object::_request (
const char * Operation);
Operation
このメンバー関数は、オペレーション名を指定する要求を作成します。引数や結果などのその他の情報はすべて、CORBA::Request
メンバー関数で設定する必要があります。
関数が成功した場合、戻り値は新しく作成された要求へのポインタです。
CORBA::Object::_create_request
ここでは、Object および Pseudo-Object Reference メンバー関数について説明します。
CORBA メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA {
void release(Object_ptr);
void release(Environment_ptr);
void release(NamedValue_ptr);
void release(NVList_ptr);
void release(Request_ptr);
void release(Context_ptr);
void release(TypeCode_ptr);
void release(POA_ptr);
void release(ORB_ptr);
void release(ExceptionList_ptr);
void release(ContextList_ptr);
Boolean is_nil(Object_ptr);
Boolean is_nil(Environment_ptr);
Boolean is_nil(NamedValue_ptr);
Boolean is_nil(NVList_ptr);
Boolean is_nil(Request_ptr);
Boolean is_nil(Context_ptr);
Boolean is_nil(TypeCode_ptr);
Boolean is_nil(POA_ptr);
Boolean is_nil(ORB_ptr);
Boolean is_nil(ExceptionList_ptr);
Boolean is_nil(ContextList_ptr);
hash(maximum);
resolve_initial_references(identifier);
...
};
指定のオブジェクト型に対して割り当てられたリソースを解放できるようにします。
void CORBA::release(spec_object_type obj);
obj
このメンバー関数は、呼び出し側が今後リファレンスにアクセスしないことを示します。その結果、関連付けられたリソースの割り当てが解除される場合があります。指定したオブジェクト参照が nil の場合、release オペレーションは何の処理も行いません。ORB の最後のリファレンスである ORB インスタンスを解放する場合、ORB は破棄の前に停止されます。これは、CORBA::release
を呼び出す前に ORB_shutdown
を呼び出すのと同じです。この処理は、ORB で呼び出された release
メンバー関数にのみ適用されます。
このメンバー関数では、CORBA 例外は送出されない場合があります。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::release(op);
指定のオブジェクト型に対応するオブジェクトが存在するかどうかを判別します。
CORBA::Boolean CORBA::is_nil(spec_object_type obj);
obj
このメンバー関数は、指定のオブジェクト参照が nil かどうかを判別するために使用します。ORB で定義した nil オブジェクト参照の特別な値がオブジェクト参照にある場合、TRUE が返されます。
このオペレーションでは、CORBA 例外は送出されない場合があります。
指定のオブジェクトが nil の場合は TRUE
を、それ以外の場合は FALSE
を返します。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
CORBA::Boolean b = CORBA::is_nil(op);
ORB 内部の識別子でオブジェクト参照への間接アクセスを提供します。
CORBA::hash(CORBA::ULong maximum);
maximum
オブジェクト参照は、ORB 内部識別子に関連付けられています。アプリケーションは、hash() オペレーションを使用して、この識別子に間接的にアクセスできます。この識別子の値は、オブジェクト参照の有効期間は変更されません。したがって、識別子のどのハッシュ関数も変更されません。
このオペレーションの値は、確実にユニークとは限りません。つまり、ほかのオブジェクト参照が同じハッシュ値を返す場合もあるということです。ただし、2 つのオブジェクト参照が別々にハッシュされた場合、アプリケーションでは 2 つのオブジェクト参照が同じでないことを判別できます。
hash オペレーションの maximum パラメータには、ORB が返すハッシュ値の上限を指定します。この値の下限はゼロです。この機能は通常、オブジェクト参照の衝突チェーン状のハッシュ テーブルを作成したり、これにアクセスしたりするために使用します。したがって、その範囲内で値がランダムに分散するほど、計算する値は小さくなり、計算精度も向上します。
identifier
文字列に対応する初期オブジェクト参照を返します。
CORBA::Object_ptr CORBA::resolve_initial_references(
const CORBA::char *identifier);
identifier
identifier
文字列に対応する初期オブジェクト参照を返します。有効な識別子は、“RootPOA”
および “POACurrent”
です。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
CORBA::Object_ptr pfobj =
orb->resolve_initial_references("RootPOA");
PortableServer::POA_ptr rootPOA;
rootPOA = PortableServer::POA::narrow(pfobj);
ORB メンバー関数は、オブジェクト リクエスト ブローカのプログラミング インタフェースです。
ORB メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA
{
class ORB
{
public:
char *object_to_string(Object_ptr);
Object_ptr string_to_object(const char *);
void create_list(Long, NVList_out);
void create_operation_list(operationDef_ptr, NVList_out);
void create_named_value(NamedValue_out);
void create_exception_list(ExceptionList_out);
void create_context_list(ContextList_out);
void get_default_context(Context_out);
void create_environment(Environment_out);
void send_multiple_requests_oneway(const requestSeq&);
void send_multiple_requests_deferred(const requestSeq&);
Boolean poll_next_response();
void get_next_response(Request_out);
Boolean work_pending();
void perform_work();
void create_policy (in PolicyType type, in any val);
// 拡張
void destroy();
// スレッド間のコンテキストの共有をサポートする拡張
void Ctx get_ctx() = 0;
void set_ctx(Ctx) = 0;
void clear_ctx() = 0;
// スレッドの拡張
void inform_thread_exit(TID) = 0;
}; //ORB
}; // CORBA
シングル スレッド ORB、および認識されないマルチスレッド コードを実行するマルチスレッド ORB をサポートするには、perform_work
と work_pending
の 2 つのオペレーションを ORB インタフェースに含めます。これらのオペレーションは、シングル スレッド アプリケーションでもマルチスレッド アプリケーションでも使用できます。アプリケーションが純粋な ORB クライアントの場合は、これらのオペレーションは不要です。
マルチスレッド サーバ アプリケーションをサポートするには、get_ctx
、set_ctx
、clear_ctx
、および inform_thread_exit
の 4 つのオペレーションを ORB インタフェースへの拡張として含めます。
以下のセクションでは、ORB の各メンバー関数について説明します。
このメソッドでコンテキストが不要になったことを示します。このメソッドは、マルチスレッド サーバ アプリケーションの開発をサポートします。
void clear_ctx()
このメソッドは、スレッドがコンテキストの使用を終了した後、アプリケーション管理のスレッドによって呼び出されます。このメソッドは、当該スレッドとコンテキストとの関連付けを解除します。
注意 : | clear_ctx メソッドは、Oracle Tuxedo システムが管理しているスレッド内からは呼び出さないでください。Oracle Tuxedo システムでは、適切にコンテキストを伝播し、管理しているスレッドを自動的にクリーンアップします。Oracle Tuxedo システムが管理しているスレッドでこのメソッドを呼び出した場合、BAD_PARAM 例外が送出されます。 |
CORBA::ORB::get_ctx
CORBA::ORB::set_ctx
void CORBA::ORB::create_context_list(
CORBA::ContextList_out List);
List
このメンバー関数は、コンテキスト文字列のリストを作成して返します。コンテキスト文字列のリストには、動的起動インタフェース (DII) で使用可能な形式で Request オペレーションを指定する必要があります。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
void CORBA::ORB::create_environment (
CORBA::Environment_out New_env);
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
void CORBA::ORB::create_exception_list(
CORBA::ExceptionList_out List);
List
このメンバー関数は、動的起動インタフェース (DII) で使用可能な形式で例外のリストを作成して返します。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
void CORBA::ORB::create_list (
CORBA::Long NumItem,
CORBA::NVList_out List);
NumItem
List
このメンバー関数は、指定の項目数を事前に割り当ててリストを作成します。リスト項目は、CORBA::NVList_add_item
メンバー関数を使用して順番にリストに追加できます。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
void CORBA::ORB::create_named_value (
NameValue_out NewNamedVal);
NewNamedVal
このメンバー関数は、NamedValue オブジェクトを作成します。これは、NamedValue オブジェクトが必要な要求の結果の引数を取得するために使用します。このメンバー関数を呼び出すと、NVList オブジェクトを作成するのに余計な手順を省くことができます。
NamedValue オブジェクトが不要になったときは、CORBA::release
メンバー関数で NamedValue オブジェクトを解放しなければなりません。
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
void CORBA::ORB::create_operation_list (
CORBA::OperationDef_ptr Oper,
CORBA::NVList_out List);
Oper
List
このメンバー関数は、動的起動インタフェース (DII) で使用可能な形式で、指定されたオペレーションの引数のリストを作成して返します。このリストが不要になったときは、CORBA::release
メンバー関数でリストを解放しなければなりません。
CORBA::OBB::create_list
CORBA::NVList::add
CORBA::NVList::add_item
CORBA::NVList::add_value
CORBA::release
指定された初期状態で特定の型のポリシー オブジェクトの新しいインスタンスを作成します。
void CORBA::ORB::create_policy (
in PolicyType type,
in any val);
type
PolicyType
値は、BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE
のみです。
val
PolicyError
このオペレーションは、指定された初期状態で特定の型のポリシー オブジェクトの新しいインスタンスを作成するために呼び出します。ポリシーの要求された型と内容を解釈できなかったために、create_policy
が新しいポリシー オブジェクトのインスタンス化に失敗した場合、適切な理由によりポリシー エラー例外が発生します (以下の例外を参照)。
リモート クライアントでは IIOP を使用しているため、コールバックを使用して BidirectionalPolicy
引数をリモート クライアントに指定します。この引数は、コールバックを使用するネイティブ クライアント、または Oracle Tuxedo サーバには使用しません。これは、Oracle Tuxedo ドメイン内部のマシンが個別に通信するためです。
GIOP 1.2 より前では、双方向ポリシーは TCP/IP を使用する IIOP では利用できませんでした。GIOP 1.0 および 1.1 の通信は一方向のため、要求がクライアントからサーバに送信され、応答がサーバからクライアントに送信されるだけでした。サーバが要求をクライアント マシンに戻す、つまりコールバックする場合、サーバ マシンでは別の一方向の接続を確立する必要がありました (ここでいう「接続」とは、オペレーティング システムのリソースのことであり、物理的な個別のワイヤや通信パスのことではありません。接続ではリソースを使用するので、接続数を最小限にすることが求められます)。
最新の Oracle Tuxedo C++ ソフトウェアでは、GIOP 1.2 をサポートしています。これにより、要求の送信と受信の両方で TCP/IP 接続を再利用できるようになりました。接続を再利用することにより、リモート クライアントが Oracle Tuxedo ドメインにコールバック リファレンスを送信するときにリソースを節約できます。共同クライアント/サーバでは、接続で Oracle Tuxedo ドメインに要求を送信します。その際、コールバックの要求に接続を再利用することができます。接続を再利用しない場合、コールバック要求では別の接続を確立しなければなりません。
接続の再利用を可能にするために、ORB/POA が用意されています。ORB/POA は、コールバック オブジェクト参照を作成します。このオブジェクト参照のサーバ (特にコールバックの場合は、リファレンスの作成元) では、セキュリティを考慮して再利用を無効にすることができます。つまり、このマシンのコールバック サーバではセキュリティを必要としますが、リモート サーバではセキュリティを必要としないため、このマシンからリモート サーバにクライアントの要求を送信接続する際はセキュリティは不要になります。このように、接続ベースで部分的にセキュリティが確立されるので、別の接続を使用する場合に限って受信時のセキュリティを確立することができます。リモート サーバでセキュリティが必要な場合、またはそのセキュリティに相互認証がある場合、通常はローカル サーバで接続の再利用を有効にしても安全と認識されます。
プロセスがサーバ (この場合、共同クライアント/サーバ) として機能してオブジェクト参照を作成する場合は、常に接続の再利用はサーバ エンドで行われます。そのため、接続を再利用することを ORB に通知する必要があります。これは、オブジェクト参照を作成する POA のポリシーを設定することによって行います。デフォルトのポリシーでは、再利用は無効になっています。したがって、再利用するためのポリシー オブジェクトを指定しない限り、POA では再利用ができません。
このデフォルトでは、CORBA バージョン 2.3 より前に記述されたコードとの下位互換性が維持されています。このようなコードでは、再利用が可能であることは認識されないので、再利用に関するセキュリティの実装を考慮する必要はありません。ただし、変更が加えられていないコードでは、ユーザがセキュリティを考慮して明示的にポリシーを転換しない限り、引き続き再利用は無効のままになります。
再利用を有効にするには、create_policy
オペレーションを使用して再利用を可能にするポリシー オブジェクトを作成し、そのポリシー オブジェクトを POA 作成用のポリシー リストの一部として使用します。
#include <BiDirPolicy_c.h>
BiDirPolicy::BidirectionalPolicy_var bd_policy;
CORBA::Any allow_reuse;
allow_reuse <<= BiDirPolicy::BOTH;
CORBA::Policy_var generic_policy =
orb->create_policy( BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE,
allow_reuse );
bd_policy = BiDirPolicy::BidirectionalPolicy::_narrow(
generic_policy );
上記の例では、create_poa
オペレーションに渡された PolicyList の中に bd_policy
を挿入しています。
void destroy();
このメソッドを使用すると、ORB に関連付けられたリソースを再利用できるよう ORB を破棄できます。ORB を破棄した場合、同じ ORB ID で ORB_init
を別に呼び出すと、新しく作成された ORB のリファレンスが返されます。現在呼び出しているスレッドからアプリケーションで ORB::destroy
メソッドを呼び出した場合、Oracle Tuxedo システムでは、OMG マイナー コード 3 の BAD_INV_ORDER
システム例外が発生します。これは、ブロッキングによってデッドロックが発生するためです。
現在のスレッドと関連付けられているコンテキストを取り出します。このメソッドは、マルチスレッド サーバ アプリケーションの開発をサポートします。
CORBA::ORB::Ctx get_ctx()
CORBA::ORB::Ctx
このメソッドを使用すると、現在のスレッドに関連付けられているコンテキストを取り出すことができます。このコンテキストは、アプリケーションによって作成および管理されるほかのスレッドを初期化するのに使用できます。
オブジェクトがスレッドを作成すると、ORB のこのオペレーションを呼び出して、スレッドに渡すことができるシステム コンテキスト情報を取得します。このオペレーションは、既にコンテキストを持っているスレッドから呼び出される必要があります。たとえば、メソッドがディスパッチされたスレッドには、既にコンテキストがあります。
thread.context = TP::orb()->get_ctx();
CORBA::ORB::set_ctx
CORBA::ORB::clear_ctx
void CORBA::ORB::get_default_context
(
CORBA::Context_out
ContextObj);
ContextObj
このメンバー関数は、デフォルト コンテキストへのリファレンスを返します。このコンテキスト リファレンスが不要になったときは、CORBA::release
メンバー関数でコンテキスト リファレンスを解放しなければなりません。
CORBA::Context::get_one_value
CORBA::Context::get_values
void CORBA::ORB::get_next_response (
CORBA::Request_out RequestObj);
RequestObj
このメンバー関数は、次に完了する要求へのリファレンスを返します。完了した要求がない場合、関数は要求が完了するまで待機します。このメンバー関数は、キューの次の要求を返します。これと対照的に CORBA::Request::get_response
メンバー関数は、特定の要求が完了するまで待機します。この要求が不要になったときは、CORBA::release
メンバー関数で要求を解放しなければなりません。
CORBA::ORB::poll_next_response
CORBA::Request::get_reponse
アプリケーション管理のスレッドに関連付けられたリソースが解放可能であることを、Oracle Tuxedo システムに通知します。このメソッドは、マルチスレッド サーバ アプリケーションの開発をサポートします。
void CORBA::ORB::inform_thread_exit(CORBA::TID threadId
)
threadId
このメソッドは、次の状態を Oracle Tuxedo システムに通知します。
注意 : | このオペレーションは、アプリケーションが作成および管理するスレッドに対してのみ呼び出します。Oracle Tuxedo システムによって管理されるディスパッチ スレッドを指定するときは、このメソッドを呼び出さないでください。 |
pOrb->inform_thread_exit(thread.threadId);
初期リファレンス メカニズムで利用可能なリファレンスがどのオブジェクトにあるかを判別します。
typedef string ObjectId;
typedef sequence ObjectId
ObjectIdList;
ObjectIdList list_initial_services ();
ObjectId
list_initial_services ()
このオペレーションは、初期リファレンス メカニズムで利用可能なリファレンスがどのオブジェクトにあるかを判別するために、アプリケーションで使用されます。このオペレーションは、ObjectId
のシーケンスである ObjectIdList
を返します。ObjectId
には文字列型が付きます。
初期化時に利用可能にする必要のある各オブジェクトには、それを表す文字列値が割り当てられます。また、ID の定義に加えて、返されているオブジェクトの型が必ず定義されます。たとえば、InterfaceRepository
は型 Repository
のオブジェクトを返し、NameService
は CosNamingContext
オブジェクトを返します。
CORBA::ORB::resolve_initial_references
char * CORBA::ORB::object_to_string (
CORBA::Object_ptr ObjRef);
ObjRef
このメンバー関数は、オブジェクト参照の文字列表現を生成します。呼び出し側のプログラムでは、文字列のメモリが不要になったら、CORBA::string_free
メンバー関数で解放する必要があります。
CORBA::Object_ptr op = TP::create_object_reference(
"IDL:Teller:1.0", "MyTeller");
char* objstr = TP::orb()->object_to_string(op);
CORBA::ORB::string_to_object
CORBA::string_free
void CORBA::ORB::perform_work ();
特にありません。
ORB が停止した後に、work_pending
および perform_work()
を呼び出すと、BAD_INV_ORDER
例外が発生します。アプリケーションでは、この例外を検出して、いつポーリング ループを終了するかを判定します。
このオペレーションは、メイン スレッドによって呼び出された場合に ORB がサーバ関連の作業を実行できるようにします。それ以外の場合は、何の処理も行いません。
work_pending()
および perform_work()
オペレーションを使用すると、ORB などのアクティビティのメイン スレッドを多重化する単純なポーリング ループを記述できます。このようなループは主に、シングル スレッドのサーバで必要になります。マルチスレッドのサーバでポーリング ループが必要になるのは、メイン スレッドの使用が必要なほかのコードと ORB の両方がある場合のみです。このようなポーリング ループについては、以下の例を参照してください。
// C++
for (;;) {
if (orb->work_pending()) {
orb->perform_work();
}
// ほかの作業を実行させるか、
// またはスリープ状態にする
}
CORBA::Boolean CORBA::ORB::poll_next_response ();
このメンバー関数は、完了した要求が未処理 (保留中) かどうかを報告します。これは、報告をするだけで要求を削除するわけではありません。完了した要求が未処理の場合、次に CORBA::ORB::get_next_response
メンバー関数を呼び出すと、直ちに要求が確実に返されます。完了した要求に未処理のものがない場合、直ちに CORBA::ORB::poll_next_response
メンバー関数が返されます (ブロッキング)。
完了した要求が未処理の場合、関数は CORBA_TRUE
を返します。
完了した要求に未処理のものがない場合、関数は CORBA_FALSE
を返します。
Object resolve_initial_references ( in ObjectId identifier )
raises (InvalidName);
identifier
このオペレーションは、初期サービスのオブジェクト参照を取得するためにアプリケーションで使用されます。インタフェースはネーミング サービスの解決方法によって異なります。つまり、ObjectId
(文字列) をより複雑なネーミング サービスの構成 (名前の構成要素の文字列のペアを含んだ構造体のシーケンス) に置き換えるかどうかで異なります。この簡素化の方法を実行すると、ネームスペースは 1 つのコンテキストに減ります。
ObjectId
は、リファレンスが必要なオブジェクトを識別する文字列です。初期リファレンスを取得するインタフェースの簡素さを維持するには、限定したオブジェクトのセットのみに、上記の方法で見つかったリファレンスを格納します。ORB 識別子とは異なり、ObjectId
ネームスペースには慎重な管理が必要になります。そのために ORB では、後にこのインタフェースを介してアプリケーションで必要になるサービスを定義したり、そのサービスの名前を指定したりできます。
現在、予約されている ObjectId
は、RootPOA
、POACurrent
、InterfaceRepository
、NameService
、TradingService
、SecurityCurrent
、TransactionCurrent
、および DynAnyFactory
です。
アプリケーションでは、resolve_initial_references
から返されるオブジェクト参照を ObjectId
で要求された型に限定します。たとえば、InterfaceRepository
の場合、返されるオブジェクトは Repository
型に限定されます。
CORBA::ORB::list_initial_services
void CORBA::ORB::send_multiple_requests_deferred (
const CORBA::ORB::RequestSeq & Reqs);
Reqs
このメンバー関数は、オペレーションが完了するのを待機せずに要求のシーケンスを送信し、呼び出し側に制御を返します。呼び出し側は、CORBA::ORB::poll_ next_response
、CORBA::ORB::get_next_response
、または CORBA::Rquest::get_response
、あるいはこれら 3 つをすべて使用して、オペレーションが完了したかどうか、および出力引数が更新されたかどうかを判別できます。
CORBA::Request::get_response
CORBA::ORB::get_next_response
CORBA::ORB::send_multiple_requests_oneway
void CORBA::ORB::send_multiple_requests_oneway (
const CORBA::RequestSeq & Reqs);
Reqs
このメンバー関数は、オペレーションが完了するのを待機せずに要求のシーケンスを送信し、呼び出し側に制御を返します。呼び出し側は、応答を待機せず、更新する出力引数も指定しません。
CORBA::ORB::send_multiple_requests_deferred
現在のスレッドのコンテキストを設定します。このメソッドは、マルチスレッド サーバ アプリケーションの開発をサポートします。
void set_ctx(CORBA::ORB::Ctx aContext
)
aContext
このメソッドは、現在のアプリケーション管理スレッドのコンテキストを設定します。指定するコンテキスト パラメータは、Oracle Tuxedo システムによって管理されている実行済みのスレッド、または初期化済みのアプリケーション管理スレッドで既に取得されています。
注意 : | set_ctx メソッドは、Oracle Tuxedo システムが管理しているスレッドでは呼び出さないでください。Oracle Tuxedo システムでは、管理しているスレッドに対して適切にコンテキストを自動的に伝達します。Oracle Tuxedo システムが管理しているスレッドで、このメソッドがアプリケーションによって呼び出された場合、BAD_PARAM 例外が送出されます。 |
TP::orb()->set_ctx(thread->context);
CORBA::ORB::get_ctx()
CORBA::ORB::clear_ctx()
CORBA::ORB::object_to_string
オペレーションによって生成された文字列を変換し、対応するオブジェクト参照を返します。
C++ バインディング
Object string_to_object ( in string str );
str
このオペレーションは、CORBA::ORB::object_to_string
オペレーションによって生成された文字列を変換するためにアプリケーションで使用され、対応するオブジェクト参照を返します。
確実に ORB でオブジェクト参照の文字列形式を認識できるようにするには、文字列を生成する際にその ORB の object_to_string
オペレーションを使用する必要があります。string_to_object
オペレーションでは、IOR の URL、corbaloc、corbalocs、および corbanames の各形式をオブジェクト参照に変換できます。変換に失敗した場合、string_to_object
オペレーションによって、次のいずれかのマイナー コードの BAD_PARAM
標準例外が発生します。
ORB に完全準拠する場合、obj
がオブジェクトの有効なリファレンスであり、2 つのオペレーションが同じ ORB で実行されると、string_to_object(object_to_string(obj))
は同じオブジェクトの有効なリファレンスを返します。ORB がサポートする IOP に完全準拠する場合は、2 つのオペレーションが異なる ORB で実行されても設定は同じままになります。
サーバ関連の作業を実行するために ORB でメイン スレッドが必要かどうかを示す値を返します。
CORBA::boolean CORBA::ORB::work_pending ();
このオペレーションは、サーバ関連の作業を実行するために ORB でメイン スレッドが必要かどうかを示す値を返します。
結果が TRUE
の場合は、サーバ関連の作業を実行するために ORB でメイン スレッドが必要であることを示します。結果が FALSE
の場合は、ORB でメイン スレッドが不要であることを示します。
ORB 初期化メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA {
<appl-name> [-ORBid {BEA_IIOP | BEA_TOBJ} ¥
static CORBA::ORB_ptr ORB_init(int& argc, char** argv,
const char* orb_identifier = 0,
const char* -ORBport nnn);
[-ORBInitRef <ObjectID>=<ObjectURL> [*]]
[-ORBDefaultInitRef <ObjectURL>]
[-ORBport port-number] ¥
[-ORBsecurePort port-number] ¥
[-ORBminCrypto {0 | 40 | 56 | 128}] ¥
[-ORBmaxCrypto {0 | 40 | 56 | 128}] ¥
[-ORBmutualAuth] ¥
[-ORBpeerValidate {detect | warn | none}] ¥
[appl-options]
};
static CORBA::ORB_ptr ORB_init(int& argc, char** argv,
const char* orb_identifier = 0);
argc
argv
orb_identifier
orb_identifier
パラメータを指定すると、リモート クライアントが “BEA_IIOP”
で明示的に指定され、「Tobj_Bootstrap」で定義されるネイティブ クライアントが “BEA_TOBJ”
で明示的に指定されます。
このメンバー関数は、ORB のオペレーションを初期化して、ORB へのポインタを返します。ORB でプログラミングする場合は、CORBA::release
メンバー関数を使用して、CORBA::ORB_ptr
ORB_init
から返された ORB ポインタに割り当てられたリソースを解放します。
返された ORB は、クライアントのタイプ (リモートまたはネイティブ) の処理方法とサーバのポート番号の処理方法を指定する 2 つの情報で初期化されています。クライアントのタイプは、orb_identifier
引数、argv 引数、またはシステム レジストリで指定できます。サーバのポート番号は、argv
引数で指定できます。
通常、引数 argc
と argv
は、メイン プログラムに渡されたパラメータと同じです。C++ での指定のように、これらのパラメータには、クライアントを起動したコマンドラインの文字列トークンが格納されます。2 つの ORB オプションは、以下の例で示すように、トークンのペアをそれぞれ使用してコマンドラインで指定できます。
ORB_init
関数は、次の手順で ORB のクライアントのタイプを判別します。
orb_identifier
引数が指定されている場合、ORB_init
は、文字列が "BEA_IIOP"
か "BEA_TOBJ"
かによって、クライアントのタイプがネイティブかリモートかを判別します。orb_identifier
文字列がある場合、argv
の -ORBid
パラメータはすべて無視または削除されます。orb_identifier
が指定されていないか、または明示的にゼロに指定されている場合、ORB_init
は argc/argv
のエントリを確認します。argv
に "-ORBid"
のエントリがある場合、次のエントリは、リモートまたはネイティブを表す "BEA_IIOP"
か "BEA_TOBJ"
かのどちらかになります。このエントリのペアが出現するのは、コマンドラインに "-ORBid BEA_IIOP”
または "-ORBid BEA_TOBJ”
のどちらかがある場合です。argc/argv
で指定されていない場合、ORB_init
は、システム レジストリ (BEA_IIOP
または BEA_TOBJ
) のデフォルトのクライアントのタイプを使用します。システム レジストリは、Oracle Tuxedo のインストール時に初期化されています。
Oracle Tuxedo リモート共同クライアント/サーバの場合、IIOP をサポートするために、サーバに対して作成されたオブジェクト参照にホストとポートを定義する必要があります。一時オブジェクト参照の場合、ORB で動的に任意のポートを取得できます。しかし、これは永続オブジェクト参照には適用できません。永続的なリファレンスの場合、ORB の再起動後に同じポートを指定する必要があります。つまり、ORB では、オブジェクト参照が作成されたのと同じポートで要求を受け付けなければなりません。このように、特定のポートを使用するように ORB をコンフィグレーションする方法は複数あります。
通常、システム管理者は、動的範囲ではなくポート番号の「ユーザ」範囲からクライアントのポート番号を割り当てます。これにより、共同クライアント/サーバでポートの競合を防ぐことができます。
ポート番号を指定するために ORB_init
は、argv
パラメータの "-ORBport"
トークンとそれに続く数値のトークンを検索します。たとえば、クライアントの実行可能ファイルの名前が sherry の場合、コマンドラインでは次のようにサーバのポート 937 に指定します。
C++ の場合、argv
パラメータの処理順序がアプリケーションでは重要になります。アプリケーションで認識されない argv
パラメータは、確実にアプリケーションで処理不要にし、ORB 初期化関数を呼び出してから、残りのパラメータを処理するようにしなければなりません。したがって、ORB_init
を呼び出した後は、argv
および argc
パラメータは、ORB で認識された引数を削除するために変更されています。この際に重要なのは、ORB_init
関数が、argv
リストのパラメータのリファレンスの順序変更または削除しかできない点です。この制限が設けられたのは、一部の argv
リストの解放を試行したり、パラメータの argv
リストの拡張を試行したりすることで発生する可能性のあるメモリ管理上の問題を防ぐためです。このような理由から、argv
は、char**&
ではなく char**
として渡されます。
注意 : | CORBA::ORB_init から返されたポインタに割り当てられたリソースを解放するには、CORBA::release メンバー関数を使用します。 |
Oracle Tuxedo の CORBA オブジェクトにアクセスしたり、CORBA オブジェクトを提供するために、Oracle Tuxedo CORBA C++ ORB に基づいてアプリケーションをコンフィグレーションします。
<appl-name> [-ORBid {BEA_IIOP | BEA_TOBJ} ¥
[-ORBInitRef <ObjectID>=<ObjectURL> [*]]
[-ORBDefaultInitRef <ObjectURL>]
[-ORBport port-number] ¥
[-ORBsecurePort port-number] ¥
[-ORBminCrypto {0 | 40 | 56 | 128}] ¥
[-ORBmaxCrypto {0 | 40 | 56 | 128}] ¥
[-ORBmutualAuth] ¥
[-ORBpeerValidate {detect | warn | none}] ¥
[appl-options]
Oracle Tuxedo CORBA C++ ORB は、Oracle Tuxedo に組み込まれているライブラリです。このライブラリを使用すると、IIOP または IIOP-SSL を使用して Oracle Tuxedo のオブジェクトにアクセスしたり、このオブジェクトを提供するための CORBA ベースのアプリケーションを開発できます。また、ORB のコマンドラインのオプションを使用すると、カスタマイズが可能になります。
[– ORBid {BEA_IIOP | BEA_TOBJ}]
BEA_IIOP
は、IIOP または IIOP-SSL プロトコルで通信するクライアント環境とサーバ環境をサポートするように、ORB がコンフィグレーションされることを明示的に指定します。
BEA_TOBJ
は、Oracle Tuxedo ドメイン内で TGIOP プロトコルでのみ通信可能なネイティブ クライアント環境をサポートするように、ORB がコンフィグレーションされることを明示的に指定します。
[– ORBInitRef
ObjectId
=
ObjectURL
]
-ORBInitRef
は、ORB 初期リファレンス引数です。この引数では、初期サービスに対して任意のオブジェクト参照を指定できます。
ObjectID
は、CORBA 仕様で定義されるサービスの既知のオブジェクト ID を表します。このメカニズムにより、ORB のインストール時に定義しなかった、新しい初期サービスの Object ID で ORB をコンフィグレーションできます。
ObjectURL
には、CORBA 仕様で定義する CORBA::ORB::string_to_object
オペレーションでサポートされている任意の URL スキーマを指定できます。URL の構文に誤りがある場合、または実装定義方法が無効と判定された場合、CORBA::ORB_init
によって CORBA::BAD_PARAM
標準例外が発生します。表 14-1 では、この例外の一覧を示します。
[– ORBDefaultInitRef <ObjectURL>]
-ORBDefaultInitRef
は、ORB のデフォルトの初期リファレンス引数です。この引数は、-ORBInitRef
で明示的に指定されていない初期リファレンスの解決に役立ちます。また、現在の Tobj_Bootstrap
オブジェクトに指定されている IIOP リスナ アドレスと同様の機能を備えています。
– ORBInitRef
引数とは異なり、-ORBDefaultInitRef
では URL が必要です。この URL は、初期オブジェクト参照を識別するための新しい URL を生成します。この URL の後にはスラッシュ文字 (/) と文字列化されたオブジェクト キーを付けます。次に、デフォルトの初期リファレンス引数の指定例を示します。-ORBDefaultInitRef corbaloc:555objs.com
ORB::resolve_initial_references(“NotificationService”)
を呼び出すと、次の新しい URL が生成されます。corbaloc:555objs.com/NotificationService
ORB::resolve_initial_references
オペレーションを実装すると、新しい URL が生成され、サービスの初期リファレンスを取得するために CORBA::ORB::string_to_object
が呼び出されます。
-ORBDefaultInitRef
引数の値として指定した URL には、複数の場所を指定できます。これは、Tobj_Bootstrap
オブジェクトで使用される場所のリストに提供されている機能とほぼ同じです。この場合、ORB では URL の構文規則に基づいて URL の場所を処理します。次に、デフォルトの初期リファレンス引数の指定例を示します。-ORBDefaultInitRef corbaloc:555objs.com,555Backup.com
ORB::resolve_initial_references(“NameService”)
を呼び出すと、次の新しい URL のどちらかが生成されます。corbaloc:555objs.com/NameService
corbaloc:555Backup.com/NameService
CORBA::ORB::string_to_object
に渡されます。
[– ORBminCrypto [0 | 40 | 56 | 128]]
[– ORBmaxCrypto [0 | 40 | 56 | 128]]
– ORBmaxCrypto
または – ORBmaxCrypto
オプションは、国際版または米国/カナダ版の Oracle Tuxedo セキュリティ アドオン パッケージがインストールされている場合にのみ使用できます。
[– ORBmutualAuth]
– ORBmutualAuth
オプションは、国際版または米国/カナダ版の Oracle Tuxedo セキュリティ アドオン パッケージがインストールされている場合にのみ使用できます。
[– ORBpeerValidate {detect | warn | none}]
detect
の場合、Oracle Tuxedo CORBA ORB は、接続に使用されるオブジェクト参照で指定されたホストがピアのデジタル証明書で指定されたドメイン名と一致するかを確認します。照合に失敗した場合、ORB はピアの認証を拒否し、接続を破棄します。このチェックによって、介在者の攻撃から保護します。
warn
の場合、Oracle Tuxedo CORBA ORB は、接続に使用されるオブジェクト参照で指定されたホストがピアのデジタル証明書で指定されたドメイン名と一致するかを確認します。照合に失敗した場合、ORB はユーザ ログにメッセージを書き込み、接続処理を続行します。
– ORBpeerValidate
オプションは、国際版または米国/カナダ版の Oracle Tuxedo セキュリティ アドオン パッケージがインストールされている場合にのみ使用できます。
detect
が指定されます。
[– ORBport port-number]
port-number
には、Oracle Tuxedo CORBA ORB プロセスが接続要求の受信をリスンする TCP ポート番号を指定します。port-number
には、0 から 65535 までの数字を指定します。
[– ORBsecurePort port-number]
port-number
には、Oracle Tuxedo CORBA ORB プロセスが接続要求の受信をリスンする TCP ポート番号を指定します。port-number
には、0 から 65535 までの数字を指定します。
– ORBport
と – ORBsecurePort
で指定するポート番号を同じ値にコンフィグレーションします。– ORBsecurePort
オプションは、国際版または米国/カナダ版の Oracle Tuxedo セキュリティ アドオン パッケージがインストールされている場合にのみ使用できます。
Oracle Tuxedo CORBA ORB は、UNIX および Microsoft Windows オペレーティング システム上で Oracle Tuxedo に組み込まれているクライアントまたはサーバとしてサポートされています。また、Windows XP オペレーティング上で Oracle Tuxedo に組み込まれているクライアントとしてもサポートされています。
Oracle Tuxedo CORBA ORB は、TCP/IP 接続で GIOP プロトコル バージョン 1.0、1.1、または 1.2 をサポートする、ORB 準拠のすべての IIOP と相互運用できます。また、Oracle Tuxedo CORBA ORB は、オブジェクト参照で TAG_SSL_SEC_TRANS
タグ付きコンポーネントの使用をサポートし、セキュア ソケット レイヤ プロトコルのバージョン 3 をサポートする、ORB 準拠のすべての IIOP-SSL と相互運用できます。
ChatClient – ORBid BEA_IIOP – ORBport 2100
-ORBDefaultInitRef corbaloc:piglet:1900
-ORBInitRef TraderService=corbaloc:owl:2530
– ORBsecurePort 2100
-ORBminCrypto 40
– ORBmaxCrypto 128
TechTopics
java – DORBDefaultInitRef=corbalocs:piglet:1900
.....-DORBInitRef=TraderService=corbaloc:owl:2530
-Dorg.omg.CORBA.ORBPort=1948
-classpath=%CLASSPATH% client
ポリシーは、オペレーションに関連する ORB に特定の選択を通知するオブジェクトです。この情報には、CORBA モジュールで定義された Policy インタフェースから生成されたインタフェースを使用する、構造化された方法でアクセスします。
注意 : | 以下の CORBA::Policy オペレーションおよび構造体は、通常の場合、プログラマにとっては必須ではありません。通常、生成されたインタフェースには、仕様に関連する情報が格納されています。ポリシー オブジェクトは、特定のファクトリ、または CORBA::create_policy オペレーションを使用することで作成できます。 |
ポリシー オブジェクトの C++ へのマッピングは次のとおりです。
class CORBA
{
class Policy
{
public:
copy();
void destroy();
}; //Policy
typedef sequence<Policy>PolicyList;
}; // CORBA
PolicyList
には、その他の C++ シーケンス マッピングと同じものを使用します。シーケンスの使用方法については、「シーケンス」を参照してください。
POA Policy および CORBA::ORB::create_policy
CORBA::Policy::copy();
このオペレーションは、ポリシー オブジェクトをコピーします。コピーでは、ポリシーとドメインまたはオブジェクトとの間にあった関係は保持されません。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
void CORBA::Policy::destroy();
ポリシー オブジェクトが破棄できないと判定された場合、CORBA::NO_PERMISSION
例外が発生します。
このオペレーションは、ポリシー オブジェクトを破棄します。破棄の可否を判定するのはポリシー オブジェクトです。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
PortableServer メンバー関数の C++ へのマッピングは次のとおりです。
// C++
class PortableServer
{
public:
class LifespanPolicy;
class IdAssignmentPolicy;
class POA::find_POA
class reference_to_id
class POAManager;
class POA;
class Current;
class virtual ObjectId
class ServantBase};
ObjectId
ObjectId
値は、POA または実装で割り当ておよび管理できます。ObjectId
値はリファレンスによってカプセル化されるので、クライアントからは隠ぺいされます。ObjectId
には標準の形式がないため、POA では未解釈のオクテット シーケンスとして管理されます。
ObjectId * activate_object (
Servant p_servant);
p_servant
指定のサーバントが既にアクティブ オブジェクト マップにある場合、ServantAlreadyActive
例外が発生します。
注意 : | POA でサポートされていないポリシーを使用する場合、ほかの例外も発生する可能性があります。 |
このオペレーションは、ObjectId
を生成し、ObjectId
および指定のサーバントをアクティブ オブジェクト マップに入れることにより、個別のオブジェクトを明示的にアクティブ化します。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
次の例では、最初の構造体がユーザ定義のコンストラクタでサーバントを作成します。2 番目の構造体は、オブジェクトでの要求の処理にサーバントが使用可能であることを POA に通知します。POA は、そのオブジェクト用に作成した ObjectId
を返します。3 番目の文は、POA に IMPLICIT_ACTIVATION
ポリシー (Oracle Tuxedo ソフトウェアのバージョン 4.2 でのみサポートされているポリシー) があると想定し、オブジェクトへのリファレンスを返します。これにより、このリファレンスは呼び出し用にクライアントで処理が可能になります。クライアントがリファレンスを呼び出すと、作成されたばかりのサーバントに要求が返されます。
MyFooServant* afoo = new MyFooServant(poa,27);
PortableServer::ObjectId_var oid =
poa->activate_object(afoo);
Foo_var foo = afoo->_this();
指定の ObjectId
で個別のオブジェクトをアクティブ化します。
void activate_object_with_id (
const ObjectId & id,
Servant p_servant);
id
p_servant
ObjectId
値で示された CORBA オブジェクトが POA で既にアクティブ化されている場合、ObjectAlreadyActive
例外が発生します。
サーバントが既にアクティブ オブジェクト マップにある場合、ServantAlreadyActive
例外が発生します。
注意 : | POA でサポートされていないポリシーを使用する場合、ほかの例外も発生する可能性があります。 |
POA に SYSTEM_ID ポリシーがあり、ObjectId
値をシステムが生成しなかったり、POA に対して生成されなかったことを検出した場合、BAD_PARAM システム例外が発生する可能性があります。こういった無効の ObjectId
値をすべて検出するのに、ORB は特に必要ではありません。ただし、POA に対してシステムによって以前に生成された ObjectId
値を持つ SYSTEM_ID ポリシーが POA にある場合、または以前にインスタンス化した同じ POA について PERSISTENT ポリシーが POA にある場合、移植可能なアプリケーションでは POA の activate_object_with_id を呼び出さないでください。
このオペレーションは、アクティブ オブジェクト マップで指定の ObjectId
と指定のサーバントとを関連付けます。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
MyFooServant* afoo = new MyFooServant(poa, 27);
PortableServer::ObjectId_var oid =
PortableServer::string_to_ObjectId("myLittleFoo");
poa->activate_object_with_id(oid.in(), afoo);
Foo_var foo = afoo->_this();
IdAssignmentPolicy インタフェースを持つオブジェクトを取得します。これにより、ユーザは POA::create_POA オペレーションにオブジェクトを渡すことができます。
IdAssignmentPolicy_ptr
PortableServer::POA::create_id_assignment_policy (
PortableServer::
IdAssignmentPolicyValue value)
value
ObjectId
がアプリケーションによってのみ割り当てられることを示す PortableServer::USE
R_ID か、または ObjectId
がシステムによってのみ割り当てられることを示す PortableServer::
SYSTEM_ID のどちらかです。
POA::create_id_assignment_policy オペレーションは、IdAssignmentPolicy インタフェースを持つオブジェクトを取得します。このポリシーに POA::create_POA オペレーションが渡されると、このポリシーは作成される POA の ObjectId
をアプリケーションが生成するか、ORB が生成するかを指定します。指定可能な値は次のとおりです。
IdAssignmentPolicy が POA 作成時に指定されない場合、SYSTEM_ID がデフォルトに指定されます。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
LifespanPolicy インタフェースを持つオブジェクトを取得します。これにより、ユーザは POA::create_POA オペレーションにオブジェクトを渡すことができます。
LifespanPolicy_ptr
PortableServer::POA::create_lifespan_policy (
PortableServer::
LifespanPolicyPolicyValue value)
value
ObjectId
がアプリケーションによってのみ割り当てられることを示す PortableServer::USE
R_ID か、または ObjectId
がシステムによってのみ割り当てられることを示す PortableServer::
SYSTEM_ID のどちらかです。
POA::create_lifespan_policy
オペレーションで LifespanPolicy
インタフェースを持つオブジェクトを取得します。このオブジェクトは、POA::create_POA
オペレーションに渡され、作成された POA で実装されるオブジェクトの寿命を指定します。指定可能な値は次のとおりです。
TRANSIENT
- POA で実装されたオブジェクトは、最初に作成されたときのプロセスの有効期間を延ばすことができません。POA が非アクティブ化されると、その POA から生成されたオブジェクト参照を使用した場合、OBJECT_NOT_EXIST
例外が発生します。 PERSISTENT
- POA で実装されたオブジェクトは、最初に作成されたときのプロセスの有効期間を延ばすことができます。
LifespanPolicy
オブジェクトが POA::create_POA
に渡されない場合、寿命ポリシーのデフォルトは TRANSIENT
に設定されます。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
POA_ptr
PortableServer::create_POA (
const char * adapter_name,
POAManager_ptr a_POAManager,
const CORBA::PolicyList & policies)
adapter_name
a_POAManager
policies
IMP_LIMIT
このオペレーションは、新しい POA を対象の POA の子として作成します。指定する名前はユニークでなければなりません。この名前で同じ親 POA を持つほかの POA と新しい POA とを識別します。
a_POAManager パラメータが NULL の場合、新しい PortableServer::POAManager
オブジェクトが作成され、新しい POA に関連付けられます。それ以外の場合、指定した POAManager オブジェクトは新しい POA に関連付けられます。POAManager オブジェクトは、属性名 the_POAManager を使用して取得できます。
指定したポリシー オブジェクトは POA に関連付けられ、その動作の制御に使用されます。ポリシー オブジェクトは、このオペレーションが戻り値を返す前にコピーされます。したがって、アプリケーションでは POA の使用中にいつでもポリシー オブジェクトを破棄できます。ポリシーは、親 POA から継承されません。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
この例では、子 POA は親 POA と同じマネージャを使用します。この場合、子 POA の状態は親と同じになります。たとえば、親がアクティブ化されていれば、子もアクティブ化されます。
CORBA::PolicyList policies(2);
policies.length (1);
policies[0] = rootPOA->create_lifespan_policy(
PortableServer::LifespanPolicy::TRANSIENT);
PortableServer::POA_ptr poa =
rootPOA->create_POA("my_little_poa",
rootPOA->the_POAManager, policies);
この例では、新しい POA がルート POA の子として作成されています。
CORBA::PolicyList policies(2);
policies.length (1);
policies[0] = rootPOA->create_lifespan_policy(
PortableServer::LifespanPolicy::TRANSIENT);
PortableServer::POA_ptr poa =
rootPOA->create_POA("my_little_poa",
PortableServer::POAManager::_nil(), policies);
POA 生成の ObjectId
値と指定のインタフェース リポジトリ ID をカプセル化するオブジェクト参照を作成します。
CORBA::Object_ptr create_reference (
const char * intf)
intf
このオペレーションには、値 SYSTEM_ID を持つ LifespanPolicy が必要です。この LifespanPolicy がない場合、PortableServer::Wro
ngPolicy 例外が発生します。
create_reference オペレーションは、POA 生成の ObjectId
値と指定のインタフェース リポジトリ ID をカプセル化するオブジェクト参照を作成します。このオペレーションは、POA に関連付けられた情報およびオペレーションのパラメータからのリファレンスを構成するために必要な情報を収集します。このオペレーションは、リファレンスを作成するだけで、リファレンスとアクティブ化されたサーバントとを関連付けるわけではありません。作成したリファレンスは、クライアントに渡されます。これにより、生成された ObjectId
を使用して、そのリファレンスの以降の要求を POA に返すことができます。生成された ObjectId
値を取得するには、作成したリファレンスで POA::reference_to_id を呼び出します。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
指定の ObjectId
とインタフェース リポジトリ ID 値をカプセル化するオブジェクト参照を作成します。
CORBA::Object_ptr create_reference_with_id (
const ObjectId & oid,
const char * intf)
oid
intf
POA に SYSTEM_ID 値を持つ LifespanPolicy があり、ObjectId
がシステムまたは POA によって生成されなかったことをその POA が検出した場合、BAD_PARAM システム例外が発生します。
create_reference オペレーションは、指定の ObjectId
とインタフェース リポジトリ ID 値をカプセル化するオブジェクト参照を作成します。このオペレーションは、POA に関連付けられた情報およびオペレーションのパラメータからリファレンスを構成するために必要な情報を収集します。このオペレーションは、リファレンスを作成するだけで、リファレンスとアクティブ化されたサーバントとを関連付けるわけではありません。作成したリファレンスは、クライアントに渡されます。これにより、そのリファレンスの以降の要求で、指定の ObjectId
を持つ同じ POA に呼び出しを返すことができます。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
PortableServer::ObjectId_var oid =
PortableServer::string_to_ObjectId("myLittleFoo");
CORBA::Object_var obj = poa->create_reference_with_id(
oid.in(), "IDL:Foo:1.0");
Foo_var foo = Foo::_narrow(obj);
アクティブ オブジェクト マップから ObjectId
を削除します。
void deactivate_object (
const ObjectId & oid)
oid
指定の ObjectId
に関連付けられたアクティブ化されたオブジェクトがない場合、ObjectNotActive 例外が発生します。
このオペレーションは、oid パラメータで指定された ObjectId
およびそのサーバントをアクティブ オブジェクト マップから削除します。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
void destroy (
CORBA::Boolean etherealize_objects,
CORBA::Boolean wait_for_completion)
etherealize_objects
wait_for_completion
このオペレーションは、POA およびすべての下位 POA を破棄します。POA とその名前は、同じプロセスで後から再作成できます。ただし、POAManager::deactivate オペレーションで同じプロセスによる関連付けられた POA の再作成を無効にしている場合は除きます。
POA が破棄された場合、実行を開始した要求については、完了するまで処理が続行されます。実行を開始していない要求については、それが新しく受け取られ、POA がないような状態で処理されます。そのため、要求は拒否され、OBJECT_NON_EXIST
例外が発生します。
wait_for_completion パラメータが TRUE
の場合、プロセス内の要求がすべて完了し、etherealize の呼び出しがすべて完了した後にのみ、destroy オペレーションは戻り値を返します。それ以外の場合、destroy オペレーションは POA の破棄後に戻り値を返します。
注意 : | このリリースの Oracle Tuxedo では、マルチスレッドをサポートしていません。そのため、オブジェクト呼び出しのコンテキストで呼び出しを行う場合、wait_for_completion は TRUE に指定しないでください。この指定を行うと、POA はそれが実行中のときに自身を解放できなくなります。 |
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
void find_POA( in string adapter_name, in boolean activate_it);
adapter_name
active_it
AdapterNonExistent
POA に指定の名前を持つ子 POA がある場合、その子 POA を返します。指定の名前を持つ子 POA が存在せず、activate_it
パラメータの値が FALSE
の場合、AdapterNonExistent
例外が発生します。
指定の reference
によってカプセル化された ObjectId
値を返します。
ObjectId reference_to_id(in Object reference);
WrongAdapter
このオペレーションは、指定の reference
によってカプセル化された ObjectId
値を返します。このオペレーションを実行中の POA によってリファレンスが作成された場合にのみ、このオペレーションは有効です。リファレンスで示されたオブジェクトがアクティブ化されているかどうかは、このオペレーションの成否には関係ありません。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
指定の reference
によってカプセル化された ObjectId
値を返します。
POAManager_ptr the_POAManager ();
この属性は読み取り専用で、POA に関連付けられた POA マネージャを識別します。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
poa->the_POAManager()->activate();
この文では、POA の POAManager の状態をアクティブ化に設定します。POAManager は、POA で要求を受け付けるときに必要になります。POA には親があるので、ルート POA ではありません。POA の親の POAManager もすべて、この文でアクティブ化状態にして有効にする必要があります。
サーバントに関連付けられた POA へのオブジェクト参照を返します。
class PortableServer
{
class ServantBase
{
public:
virtual POA_ptr _default_POA();
}
}
C++ サーバントはすべて、PortableServer::ServantBase
から継承するので、_default_POA
関数も継承します。このバージョンの Oracle Tuxedo では、通常、_default_POA
を使用する必要はありません。
この関数のデフォルトの実装では、このプロセスのデフォルト ORB のルート POA へのオブジェクト参照を返します。これは、ORB::resolve_initial_references("RootPOA")
を呼び出したときの戻り値と同じです。C++ サーバントは、この定義をオーバーライドして目的に応じた POA を返すことができます。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
CORBA::Current から生成される PortableServer::Current インタフェースは、メソッドが呼び出されたオブジェクトの ID にアクセスしてメソッド実装を提供します。
呼び出されるオブジェクトをそのコンテキストで識別する ObjectId
を返します。
ObjectId * get_object_id ();
特にありません。
POA ディスパッチ オペレーションのコンテキストの外部で呼び出された場合、PortableServer::
NoContext 例外が発生します。
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで識別する PortableServer::ObjectId
を返します。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで識別する ObjectId
を返します。
呼び出されるオブジェクトをそのコンテキストで実装する POA へのリファレンスを返します。
POA_ptr get_POA ();
特にありません。
POA ディスパッチ オペレーションのコンテキストの外部で呼び出された場合、PortableServer::
NoContext 例外が発生します。
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで実装する POA へのリファレンスを返します。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
このオペレーションは、呼び出されるオブジェクトをそのコンテキストで実装する POA へのリファレンスを返します。
各 POA オブジェクトには、関連付けられた POAManager オブジェクトがあります。POAManager は、1 つまたは複数の POA オブジェクトと関連付けることができます。POAManager は、関連付けられた POA の処理状態をカプセル化します。POA マネージャのオペレーションを使用すると、アプリケーションで POA の要求をキューに登録したり、破棄したり、POA を非アクティブ化したりできます。
POA マネージャは、暗黙的に作成および破棄されます。POA の作成時に POAManager オブジェクトを明示的に指定しない限り、POAManager は POA の作成時に作成され、自動的に POA に関連付けられます。POAManager オブジェクトは、関連付けられた POA がすべて破棄されたときに暗黙的に破棄されます。
POAManager には、アクティブ化、非アクティブ化、保持、破棄の 4 つの処理状態があります。この処理状態によって、関連付けられた POA の機能、および POA が受け取った要求を破棄するかどうかが決まります。
POAManager は保持状態で作成されます。この状態では、POAManager がアクティブ化状態に移行するまで、POA の呼び出しはすべてキューに登録されます。このバージョンの Oracle Tuxedo では、アクティブ化または非アクティブ化にだけ状態を移行することができます。したがって、このバージョンでは、保持状態に戻したり、破棄状態に移行したりすることができません。
void activate();
POAManager の状態が非アクティブ化のときにこのオペレーションを発行すると、PortableServer::POAManager::AdapterInactive
例外が発生します。
このオペレーションは、POAManager の状態をアクティブ化に変更します。状態をアクティブ化に移行すると、関連付けられた POA は要求を処理できるようになります。
注意 : | POA による要求の処理では、すべての親 POA にもアクティブ化状態の POAManager がなければなりません。 |
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
void deactivate (
CORBA::Boolean etherealize_objects,
CORBA::Boolean wait_for_completion);
etherealize_objects
FALSE
に設定する必要があります。
wait_for_completion
TRUE
に指定すると、deactivate オペレーションは、プロセス内の要求がすべて完了した後にのみ戻り値を返します。この引数を FALSE
に指定すると、deactivate オペレーションは、関連付けられた POA の状態の変更後に戻り値を返します。
POA マネージャの状態が非アクティブ化のときに発行すると、PortableServer::POAManager::AdapterInactive
例外が発生します。
このオペレーションは、POAManager の状態を非アクティブ化に変更します。状態を非アクティブ化に移行すると、関連付けられた POA は、未実行の要求およびすべての新しい要求を拒否します。
注意 : | このリリースの Oracle Tuxedo では、マルチスレッドをサポートしていません。そのため、オブジェクト呼び出しのコンテキストで呼び出しを行う場合、wait_for_completion は TRUE に指定しないでください。したがって、POAManager が現在実行中の場合、POAManager は非アクティブ化に設定できません。 |
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
CORBA::Policy から生成されたインタフェースは、POA に適用するポリシーを指定するために POA::create_POA オペレーションで使用されます。ポリシー オブジェクトは、ルート POA と同様に既存の POA のファクトリ オペレーションを作成します。ポリシー オブジェクトは、POA の作成時に指定します。既存の POA ではポリシーは変更できません。ポリシーは、親 POA から継承されません。
create_POA オペレーションにオブジェクトの寿命を指定します。
POA::create_lifespan_policy オペレーションで LifespanPolicy インタフェースを持つオブジェクトを取得します。このオブジェクトは、POA::create_POA オペレーションに渡され、作成された POA で実装されるオブジェクトの寿命を指定します。指定可能な値は次のとおりです。
永続オブジェクトには、それに関連付けられた POA (永続オブジェクトを作成した POA) があります。ORB が永続オブジェクトで要求を受け取ると、POA の名前とそのすべての上位オブジェクトを基準にして、一致する POA を検索します。
POA の名前は、その包含スコープ (親 POA) 内でユニークでなければなりません。移植可能なプログラムでは、自身の POA の名前とほかのプロセスで使用される POA の名前が衝突しないことを前提にしています。
LifespanPolicy オブジェクトが create_POA に渡されない場合、寿命ポリシーのデフォルトは TRANSIENT に設定されます。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
作成された POA の ObjectIds
の生成元をアプリケーションにするか、ORB にするかを指定します。
POA::create_id_assignment_policy オペレーションで IdAssignmentPolicy インタフェースを持つオブジェクトを取得します。このオブジェクトは、POA::create_POA オペレーションに渡され、作成された POA の ObjectId
の生成元をアプリケーションにするか、ORB にするかを指定します。指定可能な値は次のとおりです。
IdAssignmentPolicy が POA 作成時に指定されない場合、SYSTEM_ID がデフォルトに指定されます。
注意 : | この関数がサポートされるのは、共同クライアント/サーバのみです。 |
Request メンバー関数の C++ へのマッピングは次のとおりです。
// C++
class Request
{
public:
Object_ptr target() const;
const char *operation() const;
NamedValue_ptr result();
NVList_ptr arguments();
Environment_ptr env();
ExceptionList_ptr exceptions();
ContextList_ptr contexts();
void ctx(Context_ptr);
Context_ptr ctx() const
// 引数操作ヘルパー関数
Any &add_in_arg();
Any &add_in_arg(const char* name);
Any &add_inout_arg():
Any &add_inout_arg(const char* name);
Any &add_out_arg():
Any &add_out_arg(const char* name);
void set_return_type(TypeCode_ptr tc);
Any &return_value();
void invoke();
void send_oneway();
void send_deferred();
void get_response();
Boolean poll_response();
};
注意 : | add_*_arg 、set_return_type 、および return_value メンバー関数は、属性ベースのアクセサの使用を簡略化するものとして追加されます。 |
以下のセクションでは、TypeCode の各メンバー関数について説明します。
CORBA::NVList_ptr CORBA::Request::arguments () const;
このメンバー関数は、要求の引数リストを取り出します。arguments には、input
または output
、あるいはその両方を指定できます。
関数が成功した場合、戻り値は要求のオペレーションの引数リストへのポインタです。返された引数リストは Request オブジェクト参照が所有するため、解放しないでください。
オペレーションの Context オブジェクトを設定します。
void CORBA::Request::ctx (
CORBA::Context_ptr CtxObject);
CtxObject
このメンバー関数は、オペレーションの Context オブジェクトを設定します。
void CORBA::Request::get_response ();
このメンバー関数は、特定の要求の応答を取り出します。CORBA::Request::send_deferred
関数または CORBA::Request::send_multiple_requests
関数の呼び出し後に使用されます。要求が完了していない場合、CORBA::Request::get_response
関数によって要求が完了するまでブロックされます。
void CORBA::Request::invoke ();
このメンバー関数は、オブジェクト リクエスト ブローカ (ORB) を呼び出して、適切なサーバ アプリケーションに要求を送信します。
const char * CORBA::Request::operation () const;
関数が成功した場合、戻り値はオブジェクト用のオペレーションへのポインタです。値には 0 (ゼロ) を指定できます。返されたメモリは Request オブジェクトが所有するため、解放しないでください。
CORBA::Boolean CORBA::Request::poll_response ();
このメンバー関数は、要求が完了したかどうか、完了後すぐに戻り値が返されたかどうかを判別します。このメンバー関数を使用すると、要求の状態をチェックできます。また、CORBA::Request::get_response
の呼び出しがブロックするかどうかの判別にも使用できます。
関数が成功した場合、戻り値は、応答が完了済みのときは CORBA_TRUE
、応答が未完了のときは CORBA_FALSE
になります。
CORBA::ORB::get_next_response
CORBA::ORB::poll_next_response
CORBA::ORB::send_multiple_requests
CORBA::Request::get_response
CORBA::Request::send_deferred
CORBA::NamedValue_ptr CORBA::Request::result ();
関数が成功した場合、戻り値はオペレーションの結果へのポインタです。返された結果は Request オブジェクトが所有するため、解放しないでください。
CORBA::Environment_ptr CORBA::Request::env ();
関数が成功した場合、戻り値はオペレーションの環境へのポインタです。返された環境は Request オブジェクトが所有するため、解放しないでください。
CORBA::context_ptr CORBA::Request::ctx ();
関数が成功した場合、戻り値はオペレーションのコンテキストへのポインタです。返されたコンテキストは Request オブジェクトが所有するため、解放しないでください。
CORBA::ContextList_ptr CORBA::Request::contexts ();
このメンバー関数は、要求のコンテキスト リストを取り出します。
関数が成功した場合、戻り値はオペレーションのコンテキスト リストへのポインタです。返されたコンテキスト リストは Request オブジェクトが所有するため、解放しないでください。
CORBA::ExceptionList_ptr CORBA::Request::exceptions ();
関数が成功した場合、戻り値は要求の例外リストへのポインタです。返された例外リストは Request オブジェクトが所有するため、解放しないでください。
CORBA::Object_ptr CORBA::Request::target () const;
このメンバー関数は、要求の対象のオブジェクト参照を取り出します。
関数が成功した場合、戻り値はオペレーションの対象のオブジェクトへのポインタです。戻り値は Request オブジェクトが所有するため、解放しないでください。
void CORBA::Request::send_deferred ();
このメンバー関数は、遅延同期要求を開始します。この関数は、応答が要求されたときに CORBA::Request::get_response
関数と共に使用します。
CORBA::ORB::get_next_response
CORBA::ORB::poll_next_response
CORBA::ORB::send_multiple_requests
CORBA::Request::get_response
CORBA::Request::poll_response
CORBA::Request::send_oneway
void CORBA::Request::send_oneway ();
このメンバー関数は一方向の要求を開始します。この関数では、応答は要求されません。
CORBA::ORB::send_multiple_requests
CORBA::Request::send_deferred
// C++
namespace CORBA {
static char * string_alloc(ULong len);
static char * string_dup (const char *);
static void string_free(char *);
...
}
注意 : | C++ では、char の静的配列は char* に移行が進んでいます。したがって、String_var に静的配列を割り当てる際は注意が必要になります。これは、String_var では、string_alloc で割り当てられたデータをポインタが指すことを前提としており、最終的には string_free でデータを解放しようとするためです。このような動作に対応するために、ANSI/ISO C++ では、文字列リテラルが char* から const char* に変更されています。ただし、ほどんどの C++ コンパイラではこの変更を実装していないため、移植可能なプログラムを作成する際は、上記の注意事項に留意しなければなりません。 |
以下のセクションでは、文字列に割り当てられるメモリを管理する各関数について説明します。
char * CORBA::string_alloc(ULong len);
len
このメンバー関数は、文字列用のメモリを動的に割り当てます。割り当てが実行できなかった場合は、nil ポインタを返します。また、len+1
文字を割り当てるので、結果として得られた文字列には後続の NULL 文字を保持するのに十分なスペースを確保できます。このメンバー関数で割り当てられたメモリを解放するには、CORBA::string_free
メンバー関数を呼び出します。
関数が成功した場合、戻り値は文字列オブジェクト用に新しく割り当てられたメモリへのポインタです。関数が失敗した場合、戻り値は nil ポインタです。
char* s = CORBA::string_alloc(10);
CORBA::string_free
CORBA::string_dup
char * CORBA::string_dup (const char * Str);
Str
このメンバー関数は、NULL 文字も含め文字列引数のコピーを保持するのに十分なメモリを割り当ててから、そのメモリに文字列引数をコピーし、新しい文字列へのポインタを返します。
関数が成功した場合、戻り値は新しい文字列へのポインタです。関数が失敗した場合、戻り値は nil ポインタです。
char* s = CORBA::string_dup("hello world");
CORBA::string_free
CORBA::string_alloc
void CORBA::string_free(char * Str);
Str
このメンバー関数は、CORBA::string_alloc()
または CORBA::string_dup()
メンバー関数で文字列に割り当てられたメモリの割り当てを解除します。この関数に nil ポインタを渡すと、すべてのアクションが実行されなくなります。
この関数では、CORBA 例外は送出されない場合があります。
char* s = CORBA::string_dup("hello world");
CORBA::string_free(s);
CORBA::string_alloc
CORBA::string_dup
C++ では、バウンディッド ワイド文字列型とアンバウンディッド ワイド文字列型は共に CORBA::WChar*
にマッピングします。また、CORBA モジュールでは、WString_var
および WString_out
クラスを定義します。これらの各クラスは、同じメンバー関数に、対応する文字列として同じセマンティクスを提供します。ただし、これらのクラスがワイド文字列およびワイド文字を扱う場合は例外です。
ワイド文字列の動的な割り当てまたは割り当て解除は、次の関数で実行します。
// C++
namespace CORBA {
// ...
WChar *wstring_alloc(ULong len);
WChar *wstring_dup(const WChar* ws);
void wstring_free(WChar*);
};
上記のメンバー関数は、ワイド文字列を処理する点を除いて、文字列型の同じ関数として同じセマンティクスを持っています。
一般的なマッピング実装では、直接 C++ 入出力ストリームで WString_var
および WString_out
を使用するために、オーバーロードの operator<<
(挿入) と operator>>
(抽出) が提供されます。
これらのメンバー関数については、「文字列」の対応する関数を参照してください。
コード リスト 14-1 では、ワイド文字列およびワイド文字を使用したサンプル コードを示します。
// ユーザから文字列を取得
cout << "String?";
char mixed[256]; // これは十分な大きさ
char lower[256];
char upper[256];
wchar_t wmixed[256];
cin >> mixed;
// 文字列をワイド文字列に変換
// これはサーバの要求によるもの
mbstowcs(wmixed, mixed, 256);
// 文字列を大文字に変換
CORBA::WString_var v_upper = CORBA::wstring_dup(wmixed);
v_simple->to_upper(v_upper.inout());
wcstombs(upper, v_upper.in(), 256);
cout << upper << endl;
// 文字列を小文字に変換
CORBA::WString_var v_lower = v_simple->to_lower(wmixed);
wcstombs(lower, v_lower.in(), 256);
cout << lower << endl;
// すべて正常に完了
return 0;
TypeCode のコンストラクタは定義しません。ただし、マッピング インタフェース、および各基本型と各定義済み OMG IDL 型には、実装で TypeCode 擬似オブジェクト参照 (TypeCode_ptr
) へのアクセスが提供されます。この擬似オブジェクト参照には、_tc_<type>
という形式が付きます。この形式は、Any
での型を設定したり、equal
の引数として使用したりできます。これらの TypeCode リファレンス定数の名前では、<type>
は定義したスコープの範囲内にある型のローカル名を参照します。各 C++ _tc_<type>
定数は、一致した型と同じスコープ レベルで定義します。
ほかのサーバレス オブジェクトと同様に、TypeCode への C++ マッピングには _nil()
オペレーションがあります。このオペレーションは、TypeCode への nil オブジェクト参照を返します。また、作成された型に埋め込まれた TypeCode リファレンスの初期化にも使用できます。ただし、nil TypeCode リファレンスは、引数としてオペレーションに渡すことができません。これは、TypeCodes
がオブジェクト参照ではなく値として渡されるためです。
TypeCode メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA
{
class TypeCode
{
public:
class Bounds { ...};
class BadKind { ...};
Boolean equal(TypeCode_ptr) const;
TCKind kind() const;
Long param_count() const;
Any *parameter(Long) const;
RepositoryId id () const;
}; // TypeCode
}; // CORBA
TypeCode には、次の特別なメモリ管理規則があります。
以下のセクションでは、TypeCode の各メンバー関数について説明します。
2 つの TypeCode オブジェクトが同じかどうかを判別します。
CORBA::Boolean CORBA::TypeCode::equal (
CORBA::TypeCode_ptr TypeCodeObj) const;
TypeCodeObj
このメンバー関数は、TypeCode オブジェクトが入力パラメータの TypeCodeObj
と同じかどうかを判別します。
TypeCode オブジェクトが TypeCodeObj
パラメータと同じ場合、CORBA_TRUE
が返されます。
TypeCode オブジェクトが TypeCodeObj
パラメータと同じでない場合、CORBA_FALSE
が返されます。
CORBA::RepositoryId CORBA::TypeCode::id () const;
このメンバー関数は、TypeCode の ID を返します。
TypeCode オブジェクト参照に格納されているデータの種類を取り出します。
CORBA::TCKind CORBA::TypeCode::kind () const;
このメンバー関数は、CORBA::TypeCode
クラスの kind
属性を取り出します。この属性は、TypeCode オブジェクト参照に格納されているデータの種類を指定します。
メンバー関数が成功した場合、TypeCode オブジェクト参照に格納されているデータの種類を返します。TypeCode の種類とそのパラメータの一覧については、表 14-2 を参照してください。
TypeCode オブジェクト参照のパラメータ数を取り出します。
CORBA::Long CORBA::TypeCode::param_count () const;
このメンバー関数は、CORBA::TypeCode
クラスのパラメータ属性を取り出します。この属性は、TypeCode オブジェクト参照のパラメータ数を指定します。各種のパラメータの一覧については、表 14-2 を参照してください。
関数が成功した場合、TypeCode オブジェクト参照に格納されているパラメータ数を返します。
CORBA::Any * CORBA::TypeCode::parameter (
CORBA::Long Index) const;
Index
このメンバー関数は、インデックス入力引数で指定されたパラメータを取り出します。各種のパラメータの一覧については、表 14-2 を参照してください。
メンバー関数が成功した場合、戻り値はインデックス入力引数で指定されたパラメータへのポインタです。
Oracle Tuxedo ソフトウェアでは、例外の送出と捕捉をサポートしています。
注意 : | 例外コンストラクタを誤って使用すると、データ メンバーが初期化されなくなります。reason フィールド付きで定義する例外は、データ メンバーを初期化するコンストラクタを使用して作成する必要があります。デフォルトのコンストラクタを使用した場合は、そのデータ メンバーは初期化されず、例外の破棄時にシステムによって存在しないデータの破棄が試行されます。 |
注意 : | 例外を作成する際は、できる限り完全にデータ フィールドを初期化するコンストラクタを使用するようにしてください。例外を最も簡単に識別するには、OMG IDL 定義を確認します。この定義には、データ メンバーに関する追加の定義が記述されています。 |
CORBA::SystemException::SystemException ()
CORBA::SystemException::SystemException (
const CORBA::SystemException & Se)
CORBA::SystemException::SystemException(
CORBA::ULong Minor, CORBA::CompletionStatus Status)
orbminor.h
ファイルにあります。
CORBA::SystemException::~SystemException ()
CORBA::SystemException CORBA::SystemException::operator =
const CORBA::SystemException Se)
CORBA::CompletionStatus CORBA::SystemException::completed()
CORBA::SystemException::completed(
CORBA::CompletionStatus Completed)
CORBA::ULong CORBA::SystemException::minor()
CORBA::SystemException::minor (CORBA::ULong Minor)
CORBA::SystemException * CORBA::SystemException::_narrow (
CORBA::Exception_ptr Exc)
CORBA::UserException * CORBA::UserException::_narrow(
CORBA::Exception_ptr Exc)
ここでは、ORB に対して定義される標準例外について説明します。標準例外の例外識別子は、インタフェース仕様に関係なくオペレーション呼び出しの結果として返されます。標準例外は、raises
式には示されません。
標準例外の処理の複雑さを抑制するには、標準例外のセットを制御可能なサイズに抑えます。この制約により、類似する例外を数多く列挙するのではなく、同等のクラス定義の例外だけに限定することができます。
たとえば、動的なメモリ割り当てができないために、さまざまなポイントでオペレーション呼び出しが失敗することがあります。その際、動的なメモリ割り当ての失敗に対応する 1 つの例外が定義されます。つまり、マーシャルまたはマーシャル解除、クライアント、オブジェクト実装ネットワーク パケットの割り当てなど、メモリ割り当ての失敗で例外が発生するさまざまな要因に対応する、複数の異なる例外を列挙するといったことは行いません。各標準例外には、例外のサブカテゴリを指定するマイナー コードが含まれています。マイナー コードの値の割り当ては、各 ORB 実装で行います。
また、標準例外には completion_status
コードも含まれています。このコードは、次のいずれかの値を取ります。
CORBA::COMPLETED_YES
CORBA::COMPLETED_NO
CORBA::COMPLETED_MAYBE
次の表に、標準例外の説明を示します。クライアントは、この一覧にはないシステム例外の処理を準備しておく必要があります。これは、将来のバージョンの仕様で標準例外の定義が追加される可能性があるため、および ORB 実装で非標準のシステム例外が発生する可能性があるためです。例外の詳細については、『メッセージ』を参照してください。
表 14-3 に例外を定義します。
削除済みのオブジェクトを呼び出すと、常に CORBA::OBJECT_NOT_EXIST
例外が発生します。この場合、「困難な」障害として報告されます。この例外を受け取った場合は、このオブジェクト参照のすべてのコピーの削除、およびほかの適切な「最終回復」手順の実行が許可 (推奨) されます。
CORBA::TRANSACTION_REQUIRED
例外は、要求では NULL トランザクション コンテキストを登録したにもかかわらず、アクティブなトランザクションが要求されたことを示します。
CORBA::TRANSACTION_ROLLEDBACK
例外は、要求に関連付けられたトランザクションがロールバック済みか、またはロールバックとしてマークされていたことを示します。したがって、要求されたオペレーションは実行できなかったか、または実行されていません。これは、トランザクションでこれ以降の計算が無意味になるためです。
CORBA::INVALID_TRANSACTION
は、要求が無効なトランザクション コンテキストを登録したことを示します。たとえば、リソースを登録しようとしたときにエラーが発生した場合に、この例外が発生します。
ExceptionList
メンバー関数を使用すると、Request が呼び出されたときに発生するユーザ定義例外すべての TypeCode のリストを、クライアント アプリケーションまたはサーバ アプリケーションで提供できるようになります。Request メンバー関数については、「Request メンバー関数」を参照してください。
ExceptionList メンバー関数の C++ へのマッピングは次のとおりです。
class CORBA
{
class ExceptionList
{
public:
Ulong count ();
void add(TypeCode_ptr tc);
void add_consume(TypeCode_ptr tc);
TypeCode_ptr item(Ulong index);
Status remove(Ulong index);
}; // ExceptionList
}// CORBA
Ulong count ();
関数が成功した場合、戻り値はリスト内の項目数です。リストを作成したばかりで、ExceptionList オブジェクトを追加していない場合は、0 (ゼロ) が返されます。
名前の付いていない項目で ExceptionList オブジェクトを作成します。これは、flags
属性のみを設定したオブジェクトです。
void add(TypeCode_ptr tc);
tc
メンバー関数が失敗した場合、CORBA::NO_MEMORY
例外が送出されます。
このメンバー関数は、名前の付いていない項目で ExceptionList オブジェクトを作成します。これは、flags 属性のみを設定したオブジェクトです。
ExceptionList オブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成された ExceptionList オブジェクトへのポインタです。
CORBA::ExceptionList::add_consume
CORBA::ExceptionList::count
CORBA::ExceptionList::item
CORBA::ExceptionList::remove
void add_consume(TypeCode_ptr tc);
tc
このメンバー関数は、ExceptionList オブジェクトを作成します。
ExceptionList オブジェクトは動的に拡張するので、そのサイズをアプリケーションで追跡する必要はありません。
関数が成功した場合、戻り値は新しく作成された ExceptionList オブジェクトへのポインタです。
CORBA::ExceptionList::add
CORBA::ExceptionList::count
CORBA::ExceptionList::item
CORBA::ExceptionList::remove
渡されたインデックスに基づいて ExceptionList オブジェクトへのポインタを取り出します。
TypeCode_ptr item(ULong index);
index
関数が失敗した場合、BAD_PARAM
例外が送出されます。
このメンバー関数は、渡されたインデックスに基づいて ExceptionList オブジェクトへのポインタを取り出します。関数では、ゼロを基数にしたインデックスを使用します。
関数が成功した場合、戻り値は ExceptionList オブジェクトへのポインタです。
CORBA::ExceptionList::add
CORBA::ExceptionList::remove
CORBA::ExceptionList::add_consume
CORBA::ExceptionList::count
CORBA::ExceptionList::remove
指定されたインデックスの項目を削除し、関連付けられたメモリをすべて解放してから、リストの残りの項目を順序付けし直します。
Status remove(ULong index);
Index
関数が失敗した場合、BAD_PARAM
例外が送出されます。
このメンバー関数は、指定されたインデックスの項目を削除し、関連付けられたメモリをすべて解放してから、リストの残りの項目を順序付けし直します。
CORBA::ExceptionList::add
CORBA::ExceptionList::add_consume
CORBA::ExceptionList::count
CORBA::ExceptionList::item