|
|
CORBA ネーム・サービスを使用するアプリケーションの開発
ここでは、次の内容について説明します。
開発手順
表 4-1 は、CORBA ネーム・サービスを使用する BEA Tuxedo CORBA アプリケーションの開発プロセスの概略です。
手順 |
説明 |
---|---|
1 |
CosNaming インターフェイスの OMG IDL を取得します。 |
2 |
CosNaming インターフェイスの宣言およびプロトタイプをインクルードします。 |
3 |
BEA Tuxedo 名前空間に接続します。 |
4 |
BEA Tuxedo 名前空間にオブジェクトをバインドします。 |
5 |
名前を使用して BEA Tuxedo 名前空間でオブジェクトをロケートします。 |
このトピックの手順を実行する前に、CORBA ネーム・サービスのサーバ・プロセスを開始する必要があります。詳細については、CORBA ネーム・サービスのサーバ・プロセスの起動を参照してください。
このトピックの開発手順が完了したら、buildobjclient
コマンドと buildobjserver
コマンドを使用して、CORBA ネーム・サービスを使用するサーバ・アプリケーションとクライアント・アプリケーションをコンパイルします。buildobjclient
コマンドと buildobjserver
コマンドの詳細については、『BEA Tuxedo コマンド・リファレンス』を参照してください。
ステップ 1: CosNaming インターフェイスの OMG IDL を取得する
BEA 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
リスト 4-1 は、CosNaming.idl
の OMG IDL を示しています。CORBA C++ および Java アプリケーションの両方で同じ OMG IDL ファイルが使用されます。
リスト 4-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 ネーム・サービスのソフトウェア・キットの一部として提供されます。
#include "CosNaming_c.h"
BEA Tuxedo CORBA C++ クライアント・アプリケーションのインクルード・ファイルは、$TUXDIR/include
ディレクトリ (UNIX システム) または %TUXDIR%
\include
ディレクトリ (Windows システム) にあります。
import org.omg.CosNaming.*;
CORBA ネーム・サービスのインターフェイスは、org.omg.CosNaming
パッケージにあります。
BEA Tuxedo CORBA Java クライアント・アプリケーションの Java パッケージは、$TUXDIR/udataobj/java/jdk/m3envobj.jar
ファイル (UNIX システム) および %TUXDIR%
\udataobj
\java
\jdk
\m3envobj.jar
ファイル (Windows システム) にあります。
ステップ 3: BEA Tuxedo 名前空間に接続する
Bootstrap オブジェクトは、名前空間のルートに接続するために、NameService
環境オブジェクトをサポートしています。NameService 環境オブジェクトを使用する場合、オブジェクト・リクエスト・ブローカ (ORB) が名前空間のルートを特定します。次に、オブジェクト・リファレンスを CosNaming::NamingContext
または CosNamingContextExt
にナロー変換できます。オブジェクトを名前空間にバインドし、名前空間の名前を解決する前に、BEA Tuxedo 名前空間に接続する必要があります。
Bootstrap オブジェクトまたは CORBA インターオペラブル・ネーミング・サービス (INS) のブートストラップ処理メカニズムを使用すると、NameService 環境オブジェクトへの初期リファレンスを取得できます。BEA クライアント ORB を使用する場合は、BEA 社固有のメカニズムを使用します。別のベンダのクライアント ORB を使用する場合は、CORBA INS メカニズムを使用します。BEA Tuxedo ドメインのブートストラップ処理の詳細については、BEA Tuxedo オンライン・マニュアルの『CORBA プログラミング・リファレンス』の「第 4 章 CORBA ブートストラップ処理のプログラミング・リファレンス」を参照してください。
リスト 4-2 およびリスト 4-3 では、BEA Tuxedo 名前空間との通信を確立する C++ コードと Java コードを示します。
リスト 4-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);
...
リスト 4-3 Java による名前空間への接続例
...
Tobj_Bootstrap bootstrap = new Tobj_Bootstrap(orb, "");
org.omg.CORBA.Object NameServiceobj =
gBootstrapObjRef.resolve_initial_references("NameService");
CosNaming.NamingCOntextExt ns_root =
CosNaming.NamingContextExtHelper.narrow (ns_obj);
...
名前空間のルートの文字列化されたオブジェクト・リファレンスを使用して、BEA Tuxedo ドメインで名前空間に接続することもできます。文字列化されたオブジェクト・リファレンスを使用するには、CORBA ネーム・サービスのサーバ・プロセスを開始するときに -f
コマンド行オプションを指定する必要があります。-f
コマンド行オプションは、文字列化されたオブジェクト・リファレンスを CNS_ROOT_FILE
環境変数、または以下の場所のいずれかに書き込みます。
Windows
%APPDIR%
\cnsroot.dat
UNIX
$APPDIR/cnsroot.dat
名前空間のルート用の文字列化されたオブジェクト・リファレンスは、CORBA ネーム・サービスのサーバ・プロセスが開始または終了しても変更されません。文字列化されたオブジェクト・リファレンスは、特定のサーバ・プロセスではなく、特定のホスト・マシンに関連付けられているためです。BEA Tuxedo 名前空間と通信するために取得されている文字列化されたオブジェクト・リファレンスを、ほかの BEA Tuxedo と通信するために使用することはできません。
リスト 4-4 およびリスト 4-5 では、文字列化されたオブジェクト・リファレンスを使用して BEA Tuxedo 名前空間との通信を確立する C++ コードと Java コードを示します。
リスト 4-4 文字列化されたオブジェクト・リファレンスを使用する 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);
...
リスト 4-5 文字列化されたオブジェクト・リファレンスを使用する Java の例
...
Tobj_Bootstrap bootstrap = new Tobj_Bootstrap(orb, "");
BufferedReader inFile =
newBufferedReader(new FileReader ("cnsroot.dat"));
String root_ior_string = inFile.readLine ();
org.omg.CORBA.Object ns_obj =
orb.string_to_objecet (root_ior_string);
CosNaming.NamingContextExt ns_root =
CosNaming.NamingContextExtHelper.narrow (ns_obj);
...
セキュリティとトランザクションも利用する BEA Tuxedo CORBA アプリケーションで、文字列化されたオブジェクト・リファレンスを使用する場合は、以下の制限事項に注意してください。
BEA Tuxedo アプリケーションが最初に Bootstrap オブジェクトを作成しなかった場合、名前空間から取り出したオブジェクトでトランザクションとセキュリティを使用することはできません。トランザクションとセキュリティは、正式な接続を使用する必要があります。
UBBCONFIG
ファイルで定義されている場合、
BEA Tuxedo CORBA アプリケーションは、UBBCONFIG
ファイル内で
TOBJADDR
環境変数が定義している最初の IIOP リスナ/ハンドラを使用する
必要があります。
CORBA ネーム・サービスは、IIOP リスナ/ハンドラのデフォルトのホストとポートを使用して、名前空間のルートに対して文字列化されたオブジェクト・リファレンスを作成します。UBBCONFIG
ファイルで定義されている最初の IIOP リスナ/ハンドラが、デフォルト IIOP リスナ/ハンドラと見なされます。デフォルト IIOP リスナ/ハンドラを使用すると、CORBA ネーム・サービスによって取得されたすべてのオブジェクト・リファレンスが正式な接続になります。トランザクションとセキュリティは、正式な接続を使用する必要があります。
ステップ 4: BEA Tuxedo 名前空間にオブジェクトをバインドする
BEA Tuxedo 名前空間にオブジェクトをバインドする方法には、以下の 2 種類があります。
cnsbind
コマンドCosNaming::NamingContext
オブジェクトの bind()
メソッドcnsbind
コマンドを使用すると、アプリケーション・オブジェクトまたはネーミング・コンテキスト・オブジェクトを BEA Tuxedo 名前空間にバインドできます。cnsbind
コマンドを使用する前に、CORBA ネーム・サービスのサーバ・プロセスを開始する必要があります。cnsbind
コマンドの詳細については、CORBA ネーム・サービス・リファレンスを参照してください。
リスト 4-6 とリスト 4-7 では、CosNaming::NamingContext
オブジェクトの bind()
メソッドの C++ および Java コード・インプリメンテーションを示します。このコード例では、Name
の id
フィールドと kind
フィールドを表す 2 つのパラメータを受け付けます。この 2 つのパラメータは、SimpleFactory
オブジェクトの Name
を初期化し、SimpleFactory
オブジェクトを名前空間にバインドします。
リスト 4-6 C++ による BEA 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);
...
リスト 4-7 Java による BEA Tuxedo 名前空間への名前のバインディング例
...
//SimpleFactory のオブジェクト・リファレンスを作成
org.omg.CORBA.object fact_ref =
TP.create_object_reference(
SimpleFactoryHelper.id()
"simple_factory",
null
);
...
//NameService オブジェクト・リファレンスを取得。リスト 4-3 を参照
//SimpleFactory のオブジェクト・リファレンスを名前空間に配置
CosNaming.NameComponent[] factName =
ns_root.to_name("simple_factory");
ns_root.bind(factName, fact_ref);
...
ステップ 5: 名前を使用して BEA Tuxedo 名前空間でオブジェクトをロケートする
CosNaming::NamingContext
オブジェクトの resolve()
メソッドを使用して、BEA Tuxedo ドメインの名前空間でオブジェクトをロケートします。リスト 4-8 とリスト 4-9 では、Name
の id
フィールドと kind
フィールドを表す 2 つのパラメータを受け付ける C++ および Java コードを示します。コード例では、ネーミング・コンテキストにバインドし、名前を解決し、指定したオブジェクトのオブジェクト・リファレンスを取得します。
リスト 4-8 C++ による BEA 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());
//BEA Tuxedo CORBA ネーム・サービスから取得したリファレンスを使用して
//Simple オブジェクトを検索
Simple_var v_simple = v_simple_factory_ref->find_simple();
...
リスト 4-9 Java による BEA Tuxedo 名前空間での名前のロケート例
...
//文字列名を基に名前空間で SimpleFactory オブジェクトを検索
org.omg.CORBA.Object simple_fact_oref =
ns_root.resolve_str("simple_factory");
SimpleFactory simple_factory_ref =
SimpleFactoryHelper.narrow(simple_fact_oref);
//Simple オブジェクトを検索
Simple simple = simple_factory_ref.find_simple();
...
|
Copyright © 2001, BEA Systems, Inc. All rights reserved.
|