Tuxedo CORBA ネーム サービス

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

CORBA ネーム サービスを使用するアプリケーションの開発

ここでは、以下の内容について説明します。

注意 : 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 アプリケーションの開発プロセスの概略です。

表 5-1 開発プロセス
手順
説明
1
CosNaming インタフェースの OMG IDL を取得します。
2
CosNaming インタフェースの宣言およびプロトタイプをインクルードします。
3
Oracle Tuxedo ネームスペースに接続します。
4
Oracle Tuxedo ネームスペースにオブジェクトをバインドします。
5
名前を使用して Oracle Tuxedo ネームスペースでオブジェクトをロケートします。

このトピックの手順を実行する前に、CORBA ネーム サービスのサーバ プロセスを開始する必要があります。詳細については、「CORBA ネーム サービスのサーバ プロセスの起動」を参照してください。

このトピックの開発手順が完了したら、buildobjclient コマンドと buildobjserver コマンドを使用して、CORBA ネーム サービスを使用するサーバ アプリケーションとクライアント アプリケーションをコンパイルします。buildobjclient および buildobjserver コマンドの詳細については、『Tuxedo コマンド リファレンス』を参照してください。

 


ステップ 1: CosNaming インタフェースの OMG IDL を取得する

Oracle Tuxedo CORBA アプリケーションは、CosNaming.idl で定義したインタフェースを使用して CORBA ネーム サービスにアクセスします。この Object Management Group (OMG) インタフェース定義言語 (IDL) ファイルは、CORBA ネーム サービスで使用するインタフェース、COSnaming データ構造体、例外を定義します。CosNaming.idl ファイルは、以下のディレクトリの場所にあります。

Windows

drive:\%TUXDIR%\include\CosNaming.idl

UNIX

/usr/local/$TUXDIR/include/CosNaming.idl

コード リスト 5-1 は、CosNaming.idl の OMG IDL を示しています。CORBA C++ アプリケーションでも同じ OMG IDL ファイルが使用されます。

コード リスト 5-1 CosNaming.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_

 


ステップ 2: CosNaming インタフェースの宣言およびプロトタイプをインクルードする

CosNaming インタフェースの宣言とプロトタイプは、CORBA ネーム サービスのソフトウェア キットの一部として提供されます。

 


ステップ 3: Oracle Tuxedo ネームスペースに接続する

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++ コードを示します。

コード リスト 5-2 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 環境変数、または以下の場所のいずれかに書き込みます。

Windows

%APPDIR%¥cnsroot.dat

UNIX

$APPDIR/cnsroot.dat

ネームスペースのルート用の文字列化されたオブジェクト参照は、CORBA ネーム サービスのサーバ プロセスが開始または終了しても変更されません。文字列化されたオブジェクト参照は、特定のサーバ プロセスではなく、特定のホスト マシンに関連付けられているためです。Oracle Tuxedo ネームスペースと通信するために取得されている文字列化されたオブジェクト参照を、ほかの Oracle Tuxedo と通信するために使用することはできません。

コード リスト 5-3 では、文字列化されたオブジェクト参照を使用して Oracle Tuxedo ネームスペースとの通信を確立する C++ コードを示します。

コード リスト 5-3 文字列化されたオブジェクト参照を使用する 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 アプリケーションで、文字列化されたオブジェクト参照を使用する場合は、以下の制限事項に注意してください。

  1. Oracle Tuxedo CORBA アプリケーションは、文字列化されたオブジェクト参照を使用して Oracle Tuxedo ネームスペースに接続する前に、Bootstrap オブジェクトを作成して、IIOP リスナ/ハンドラに接続する必要があります。Bootstrap オブジェクトを最初に呼び出すことで、Oracle Tuxedo アプリケーションは、IIOP リスナ/ハンドラへの正式な接続を確立します。
  2. Oracle Tuxedo アプリケーションが最初に Bootstrap オブジェクトを作成しなかった場合、ネームスペースから取り出したオブジェクトでトランザクションとセキュリティを使用することはできません。トランザクションとセキュリティは、正式な接続を使用する必要があります。

  3. 複数の IIOP リスナ/ハンドラが UBBCONFIG ファイルで定義されている場合、Oracle Tuxedo CORBA アプリケーションは、UBBCONFIG ファイル内で TOBJADDR 環境変数が定義している最初の IIOP リスナ/ハンドラを使用する必要があります。
  4. CORBA ネーム サービスは、IIOP リスナ/ハンドラのデフォルトのホストとポートを使用して、ネームスペースのルートに対して文字列化されたオブジェクト参照を作成します。UBBCONFIG ファイルで定義されている最初の IIOP リスナ/ハンドラが、デフォルト IIOP リスナ/ハンドラと見なされます。デフォルト IIOP リスナ/ハンドラを使用すると、CORBA ネーム サービスによって取得されたすべてのオブジェクト参照が正式な接続になります。トランザクションとセキュリティは、正式な接続を使用する必要があります。

 


ステップ 4: Oracle Tuxedo ネームスペースにオブジェクトをバインドする

Oracle Tuxedo ネームスペースにオブジェクトをバインドする方法には、以下の 2 種類があります。

cnsbind コマンドを使用すると、アプリケーション オブジェクトまたはネーミング コンテキスト オブジェクトを Oracle Tuxedo ネームスペースにバインドできます。cnsbind コマンドを使用する前に、CORBA ネーム サービスのサーバ プロセスを開始する必要があります。cnsbind コマンドの詳細については、「CORBA ネーム サービス リファレンス」を参照してください。

コード リスト 5-4 では、CosNaming::NamingContext オブジェクトの bind() メソッドの C++ 実装を示します。このサンプル コードでは、Nameid フィールドと kind フィールドを表す 2 つのパラメータを受け付けます。この 2 つのパラメータは、SimpleFactory オブジェクトの Name を初期化し、SimpleFactory オブジェクトをネームスペースにバインドします。

コード リスト 5-4 C++ による Oracle Tuxedo ネームスペースへの名前のバインディング例
...
// ネームスペースで 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);
...

 


ステップ 5: 名前を使用して Oracle Tuxedo ネームスペースでオブジェクトをロケートする

CosNaming::NamingContext オブジェクトの resolve() メソッドを使用して、Oracle Tuxedo ドメインのネームスペースでオブジェクトをロケートします。コード リスト 5-5 では、Nameid フィールドと kind フィールドを表す 2 つのパラメータを受け付ける C++ コードを示します。サンプル コードでは、ネーミング コンテキストにバインドし、名前を解決し、指定したオブジェクトのオブジェクト参照を取得します。

コード リスト 5-5 C++ による Oracle Tuxedo ネームスペースでの名前のロケート例
...
// ネームスペースで 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();
...

  ページの先頭       前  次