CORBAネーム・サービスの使用

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

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コマンドの詳細は、『Oracle 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"
       ytypedef 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オンライン・ドキュメントの『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ネームスペースへの名前のバインディング例
...
//Establish the Name used to identify the SimpleFactory object
//in the namespace.

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 *) "";
//Create an object reference for the SimpleFactory object

s_v_factory_refer = TP::create_object_reference(
                                   _tc_SimpleFactory->id(),
                                   "simple_factory",
                                   CORBA::NVList::_nil()
);
//Get the NameService object reference. See Listing 4-2.
//Place the object reference for SimpleFactory in the namespace

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ネームスペースでの名前のロケート例
...
//Establish the Name used to identify the SimpleFactory object
//in the namespace.
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 *) "";

//Locate the SimpleFactory object in the namespace
CORBA::Object_var v_simple_factory_oref =
              root->resolve( *factory_name);
SimpleFactory_var v_simple_factory_ref =
              SimpleFactory::_narrow(v_simple_factory_oref.in());

// Use the reference obtained from the Oracle Tuxedo CORBA Name Service // to find the Simple object
Simple_var v_simple = v_simple_factory_ref->find_simple();
...

  先頭に戻る       前  次