|
注意 : | Oracle Tuxedo CORBA Java クライアントと Oracle Tuxedo CORBA Java クライアント ORB は Tuxedo 8.1 で非推奨になり、サポートされなくなりました。すべての Oracle Tuxedo CORBA Java クライアントおよび Oracle Tuxedo CORBA Java クライアント ORB のテキスト リファレンスとコード サンプルは、サード パーティ製の Java ORB ライブラリをインプリメントまたは実行する際の参考や、プログラマの参照用としてのみ使用してください。 |
注意 : | サード パーティの CORBA Java ORB のテクニカル サポートは、各ベンダによって提供されます。Oracle Tuxedo では、サード パーティの CORBA Java ORB に関する技術的なサポートやマニュアルは提供していません。 |
表 5-1 は、CORBA ネーム サービスを使用する Oracle Tuxedo CORBA アプリケーションの開発プロセスの概略です。
このトピックの手順を実行する前に、CORBA ネーム サービスのサーバ プロセスを開始する必要があります。詳細については、「CORBA ネーム サービスのサーバ プロセスの起動」を参照してください。
このトピックの開発手順が完了したら、buildobjclient
コマンドと buildobjserver
コマンドを使用して、CORBA ネーム サービスを使用するサーバ アプリケーションとクライアント アプリケーションをコンパイルします。buildobjclient
および buildobjserver
コマンドの詳細については、『Tuxedo コマンド リファレンス』を参照してください。
Oracle Tuxedo CORBA アプリケーションは、CosNaming.idl
で定義したインタフェースを使用して CORBA ネーム サービスにアクセスします。この Object Management Group (OMG) インタフェース定義言語 (IDL) ファイルは、CORBA ネーム サービスで使用するインタフェース、COSnaming データ構造体、例外を定義します。CosNaming.idl
ファイルは、以下のディレクトリの場所にあります。
drive
:\%TUXDIR%\include\CosNaming.idl
/
usr
/
local
/$TUXDIR/include/CosNaming.idl
コード リスト 5-1 は、CosNaming.idl の OMG IDL を示しています。CORBA C++ アプリケーションでも同じ OMG IDL ファイルが使用されます。
#ifndef _COSNAMING_IDL_
#define _COSNAMING_IDL_
module CosNaming {
#pragma prefix "omg.org/CosNaming"
typedef string Istring;
struct NameComponent {
Istring id;
Istring kind;
};
typedef sequence<NameComponent> Name;
enum BindingType { nobject, ncontext };
struct Binding {
Name binding_name;
BindingType binding_type;
};
typedef sequence <Binding> BindingList;
interface BindingIterator;
interface NamingContext {
enum NotFoundReason { missing_node,
not_context,
not_object };
exception NotFound {
NotFoundReason why;
Name rest_of_name;
};
exception CannotProceed {
NamingContext cxt;
Name rest_of_name;
};
exception InvalidName{};
exception AlreadyBound {};
exception NotEmpty{};
void bind(in Name n, in Object obj)
raises(NotFound,
CannotProceed,
InvalidName,
AlreadyBound);
void rebind(in Name n, in Object obj)
raises(NotFound,
CannotProceed,
InvalidName);
void bind_context(in Name n, in NamingContext nc)
raises(NotFound,
CannotProceed,
InvalidName,
AlreadyBound);
void rebind_context(in Name n, in NamingContext nc)
raises(NotFound,
CannotProceed,
InvalidName);
Object resolve (in Name n)
raises(NotFound,
CannotProceed,
InvalidName);
void unbind(in Name n)
raises(NotFound,
CannotProceed,
InvalidName);
NamingContext new_context();
NamingContext bind_new_context(in Name n)
raises(NotFound,
AlreadyBound,
CannotProceed,
InvalidName);
void destroy() raises(NotEmpty);
void list(in unsigned long how_many,
out BindingList bl,
out BindingIterator bi);
};
interface BindingIterator {
boolean next_one(out Binding b);
boolean next_n(in unsigned long how_many,
out BindingList bl);
void destroy();
};
interface NamingContextExt:NamingContext {
typedef string StringName;
typedef string Address;
typedef string URLString;
StringName to_string(in Name n) raises(InvalidName);
Name to_name(in StringName sn)
raises(InvalidName);
exception InvalidAddress {};
URLString to_url(in Address addr, in StringName sn)
raises(InvalidAddress, InvalidName);
Object resolve_str(in StringName n)
raises(NotFound,
CannotProceed,
InvalidName,
AlreadyBound
);
};
};
#pragma ID CosNaming "IDL:omg.org/CosNaming:1.0"
#endif // _COSNAMING_IDL_
CosNaming インタフェースの宣言とプロトタイプは、CORBA ネーム サービスのソフトウェア キットの一部として提供されます。
Oracle Tuxedo CORBA C++ クライアント アプリケーションのインクルード ファイルは、$TUXDIR/include
ディレクトリ (UNIX システム) または %TUXDIR%¥include
ディレクトリ (Windows システム) にあります。
Bootstrap オブジェクトは、ネームスペースのルートに接続するために、NameService
環境オブジェクトをサポートしています。NameService 環境オブジェクトを使用する場合、オブジェクト リクエスト ブローカ (ORB) がネームスペースのルートを特定します。次に、オブジェクト参照を CosNaming::NamingContext
または CosNamingContextExt
にナロー変換できます。オブジェクトをネームスペースにバインドし、ネームスペースの名前を解決する前に、Oracle Tuxedo ネームスペースに接続する必要があります。
Bootstrap オブジェクトまたは CORBA インターオペラブル ネーミング サービス (INS) のブートストラップ処理メカニズムを使用すると、NameService 環境オブジェクトへの初期リファレンスを取得できます。Oracle クライアント ORB を使用する場合は、Oracle 社固有のメカニズムを使用します。別のベンダのクライアント ORB を使用する場合は、CORBA INS メカニズムを使用します。Oracle Tuxedo ドメインのブートストラップ処理の詳細については、Oracle Tuxedo オンライン マニュアルの『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。
コード リスト 5-2 では、Oracle Tuxedo ネームスペースとの通信を確立する C++ コードを示します。
...
Tobj_Bootstrap * bootstrap = new Tobj_Bootstrap (v_orb.in(), "");
CORBA::Object_var var_nameservice_oref=
bootstrap.resolve_initial_references("NameService");
root = CosNaming::NamingContext::_narrow (obj);
...
ネームスペースのルートの文字列化されたオブジェクト参照を使用して、Oracle Tuxedo ドメインでネームスペースに接続することもできます。文字列化されたオブジェクト参照を使用するには、CORBA ネーム サービスのサーバ プロセスを開始するときに -f
コマンドライン オプションを指定する必要があります。-f
コマンドライン オプションは、文字列化されたオブジェクト参照を CNS_ROOT_FILE
環境変数、または以下の場所のいずれかに書き込みます。
ネームスペースのルート用の文字列化されたオブジェクト参照は、CORBA ネーム サービスのサーバ プロセスが開始または終了しても変更されません。文字列化されたオブジェクト参照は、特定のサーバ プロセスではなく、特定のホスト マシンに関連付けられているためです。Oracle Tuxedo ネームスペースと通信するために取得されている文字列化されたオブジェクト参照を、ほかの Oracle Tuxedo と通信するために使用することはできません。
コード リスト 5-3 では、文字列化されたオブジェクト参照を使用して Oracle Tuxedo ネームスペースとの通信を確立する C++ コードを示します。
...
Tobj_Bootstrap * bootstrap;
bootstrap = new Tobj_Bootstrap (v_orb.in(), "");
CORBA::Object_var obj = GetRefFromFile ("cnsroot.dat", v_orb);
root = CosNaming::NamingContext::_narrow (obj);
...
セキュリティとトランザクションも利用する Oracle Tuxedo CORBA アプリケーションで、文字列化されたオブジェクト参照を使用する場合は、以下の制限事項に注意してください。
Oracle Tuxedo アプリケーションが最初に Bootstrap オブジェクトを作成しなかった場合、ネームスペースから取り出したオブジェクトでトランザクションとセキュリティを使用することはできません。トランザクションとセキュリティは、正式な接続を使用する必要があります。
UBBCONFIG
ファイルで定義されている場合、Oracle Tuxedo CORBA アプリケーションは、UBBCONFIG
ファイル内で TOBJADDR
環境変数が定義している最初の IIOP リスナ/ハンドラを使用する必要があります。
CORBA ネーム サービスは、IIOP リスナ/ハンドラのデフォルトのホストとポートを使用して、ネームスペースのルートに対して文字列化されたオブジェクト参照を作成します。UBBCONFIG
ファイルで定義されている最初の IIOP リスナ/ハンドラが、デフォルト IIOP リスナ/ハンドラと見なされます。デフォルト IIOP リスナ/ハンドラを使用すると、CORBA ネーム サービスによって取得されたすべてのオブジェクト参照が正式な接続になります。トランザクションとセキュリティは、正式な接続を使用する必要があります。
Oracle Tuxedo ネームスペースにオブジェクトをバインドする方法には、以下の 2 種類があります。
cnsbind
コマンドを使用すると、アプリケーション オブジェクトまたはネーミング コンテキスト オブジェクトを Oracle Tuxedo ネームスペースにバインドできます。cnsbind
コマンドを使用する前に、CORBA ネーム サービスのサーバ プロセスを開始する必要があります。cnsbind
コマンドの詳細については、「CORBA ネーム サービス リファレンス」を参照してください。
コード リスト 5-4 では、CosNaming::NamingContext
オブジェクトの bind()
メソッドの C++ 実装を示します。このサンプル コードでは、Name
の id
フィールドと kind
フィールドを表す 2 つのパラメータを受け付けます。この 2 つのパラメータは、SimpleFactory
オブジェクトの Name
を初期化し、SimpleFactory
オブジェクトをネームスペースにバインドします。
...
// ネームスペースで SimpleFactory オブジェクトの識別に使用する
// Name の確立
CosNaming::Name_var factory_name = new CosNaming::Name(1);
factory_name->length(1);
factory_name[(CORBA::ULong) 0].id =
(const char * "simple_factory";
factory_name[(CORBA::ULong) 0].kind =
(const char *) "";
// SimpleFactory のオブジェクト参照を作成
s_v_factory_refer = TP::create_object_reference(
_tc_SimpleFactory->id(),
"simple_factory",
CORBA::NVList::_nil()
);
// NameService オブジェクト参照を取得。コード リスト 4-2 を参照
//SimpleFactory のオブジェクト参照をネームスペースに配置
root->bind(factory_name, s_v_fact_ref);
...
CosNaming::NamingContext
オブジェクトの resolve()
メソッドを使用して、Oracle Tuxedo ドメインのネームスペースでオブジェクトをロケートします。コード リスト 5-5 では、Name
の id
フィールドと kind
フィールドを表す 2 つのパラメータを受け付ける C++ コードを示します。サンプル コードでは、ネーミング コンテキストにバインドし、名前を解決し、指定したオブジェクトのオブジェクト参照を取得します。
...
// ネームスペースで SimpleFactory オブジェクトの識別に使用する
// Name の確立
CosNaming::Name_var factory_name = new CosNaming::Name(1);
factory_name->length(1);
factory_name[(CORBA::ULong) 0].id =
(const char * "simple_factory";
factory_name[(CORBA::ULong) 0].kind =
(const char *) "";
// SimpleFactory オブジェクトをネームスペースでロケート
CORBA::Object_var v_simple_factory_oref =
root->resolve( *factory_name);
SimpleFactory_var v_simple_factory_ref =
SimpleFactory::_narrow(v_simple_factory_oref.in());
// Oracle Tuxedo CORBA ネーム サービスから取得したリファレンスを使用して Simple オブジェクトを検索
Simple_var v_simple = v_simple_factory_ref->find_simple();
...