例: デフォルトの初期コンテキストの取得
プログラムによるデフォルトの初期コンテキストの取得には、さまざまな方法があります。
以下の例は、デフォルトの初期コンテキストを取得するものです。 javax.naming.InitialContext コンストラクターにはプロバイダー URL が渡されないことに注意してください。
...
import javax.naming.Context;
import javax.naming.InitialContext;
...
Context initialContext = new InitialContext();
...
戻されるデフォルトの初期コンテキストは、Java™ Naming and Directory Interface (JNDI) クライアントのランタイム環境に依存します。以下は、さまざまな 環境内で戻される初期コンテキストです。
- シン・クライアント
- 初期コンテキストは、ポート 2809 のローカル・ホストで稼働しているサーバーの サーバー・ルート・コンテキストです。
- ピュア・クライアント
- 初期コンテキストは、-CCD コマンド行パラメーターを指定して launchClient コマンドに渡される java.naming.provider.url プロパティーによって指定されるコンテキストです。
このコンテキストは、通常、URL で指定されているアドレスにあるサーバーのサーバー・ルート・コンテキストです。ただし、他のコンテキストに解決される corbaname または corbaloc URL を構成することもできます。
プロバイダー URL が指定されていない場合、 -CCproviderURL、または -CCBootstrapHost および -CCBootstrapPort コマンド行パラメーターで 指定されているホストおよびポートで稼働しているサーバーのサーバー・ルート・コンテキストです。 デフォルトのホストはローカル・ホストであり、デフォルトのポートは 2809 です。
- サーバー・プロセス
- 初期コンテキストは、そのプロセスのサーバー・ルート・コンテキストです。
前の例ではプロバイダー URL は明示的に指定されていませんが、InitialContext のコンストラクターは、プロパティーの設定の検索場所となっている他の場所で定義されているプロバイダー URL を見つける可能性があります。
ORB の初期化に影響するプロパティーを使用する場合は、このセクションの残りの部分を読み、 初期コンテキストの正確な取得方法についてより深く理解する必要があります。
初期コンテキストを取得するために使用するサーバーの決定
WebSphere® Application Server のネーム・サーバーは、CORBA CosNaming ネーム・サーバーであり、 製品では、製品名前空間で JNDI クライアントがネーミング操作を実行するための CosNaming JNDI プラグインの実装を提供しています。CosNaming プラグイン実装は、InitialContext コンストラクターに渡される JNDI プロパティーを介して選択します。このプロパティーは java.naming.factory.initial で、初期コンテキストを取得するために使用する初期コンテキストのファクトリー実装を指定します。このファクトリーは、その実装の一部である javax.naming.Context のインスタンスを戻します。
初期コンテキスト・ファクトリーの com.ibm.websphere.naming.WsnInitialContextFactory は、一般的に、アプリケーションが JNDI 操作を行う場合に使用します。 この初期コンテキスト・ファクトリーが JNDI クライアントによって明示的に指定されていない場合、WebSphere Application Server のランタイム環境は、 それを使用するようにセットアップされます。初期コンテキスト・ファクトリーが呼び出されると、初期コンテキストが取得されます。以下のパラグラフでは、初期コンテキスト・ファクトリーが、クライアントおよびサーバーの環境で初期コンテキストを取得する方法について説明します。
- サーバー・プロセスにおける初期参照の登録
すべての WebSphere Application Server では、ORB を使用して、そのサーバーで実行されているオブジェクトでの呼び出しを受け取ったり、 ディスパッチしたりします。サーバー・プロセスで実行されているサービスは、初期参照をその ORB に登録することができます。各初期参照は、ストリング値であるキーに基づいて登録されます。任意の CORBA オブジェクトを初期参照にすることができます。WebSphere Application Server のネーム・サーバーは、 いくつかの初期コンテキストを、事前定義されているキーに基づいて初期参照として登録します。各ネーム・サーバーの初期参照は、インターフェース org.omg.CosNaming.NamingContext のインスタンスです。
- ピュア・クライアント・プロセスにおける初期参照の取得
JNDI のピュア・クライアント、 つまり WebSphere Application Server プロセスで実行されていない JNDI クライアントも ORB インスタンスを持ちます。このクライアント ORB インスタンスは InitialContext コンストラクターに渡されますが、一般的に、初期コンテキスト・ファクトリーが、クライアント ORB インスタンスを透過的に作成し、初期化します。クライアント ORB は初期参照で初期化できますが、その初期参照は、ほとんどの場合、あるサーバーで実行されているオブジェクトに解決します。初期コンテキスト・ファクトリーは、ORB を初期化する場合のデフォルトの初期参照を定義しません。初期参照が構成されていない場合に、クライアント ORB の resolve_initial_references メソッドが呼び出されると、そのメソッド呼び出しは失敗します。 この状態は、典型的なピュア・クライアント・プロセスです。NamingContext の初期参照を取得するには、 初期コンテキスト・ファクトリーは、corbaloc:iiop:myhost:2809 な どの IIOP 型の CORBA オブジェクト URL を指定して string_to_object を呼び出す必要があります。 この URL は、初期コンテキストの取得先であるサーバーのアドレスを指定します。ホストおよびポート情報は、InitialContext コンストラクターに渡されたプロバイダー URL から抽出されます。
プロバイダー URL が定義されていない場合、WebSphere Application Server の初期コンテキスト・ファクトリーは、 デフォルトのプロバイダー URL である corbaloc:iiop:localhost:2809 を使用します。
プロバイダー URL が定義されていない場合、WebSphere Application Server の初期コンテキスト・ファクトリーは、 デフォルトのプロバイダー URL である corbaloc:iiop:your.server.name:2809 を使用します。
string_to_object ORB メソッドは、その URL を解決し、ターゲット・サーバーの ORB と通信して初期参照を取得します。
- サーバー・プロセスにおける初期参照の取得
JNDI クライアントが WebSphere Application Server プロセスで実行されているときに、JNDI クライアントが ORB インスタンスを提供しない場合、 初期コンテキスト・ファクトリーは、サーバーの ORB への参照を取得します。通常、サーバー・プロセスで実行されている JNDI クライアントは、サーバーの ORB インスタンスを使用します。つまり、これらの JNDI クライアントは、ORB インスタンスを InitialContext コンストラクターに渡しません。サーバー・プロセスで稼働しているネーム・サーバーは、あるプロバイダー URL を java.lang.System プロパティーとして設定し、そのプロセス内のすべての JNDI クライアントのデフォルトのプロバイダー URL としてそのプロバイダー URL を提供します。このデフォルトのプロバイダー URL は corbaloc:rir:/NameServiceServerRoot です。 この URL は、そのサーバーのサーバー・ルート・コンテキストに解決します。 (この URL は、NameServiceServerRoot というキーで ORB の resolve_initial_references を呼び出すことと等価です。 ネーム・サーバーは、そのサーバー・ルート・コンテキストをそのキーでの初期参照として登録します。)
- レガシー ORB プロトコルの理解
WebSphere Application Server バージョン 5 より前のリリースでは、別の ORB 実装を使用していました。 現在使用されている Interoperable Name Service (INS) プロトコルとは対照的にレガシー・プロトコルを使用していました。この変更は、 初期コンテキスト・ファクトリーの実装に影響を与えています。いくつかのタイプのピュア・クライアントでは、JNDI の初期コンテキストを取得するときに、 前のリリースの WebSphere Application Server と比較して、異なる振る舞いを経験することがあります。この振る舞いについては、このセクションで後から詳細を説明します。
以下に示す ORB のプロパティーは、レガシーの ORB プロトコルとともに ORB の初期化に使用されますが、現在は使用できなくなっています。
- com.ibm.CORBA.BootstrapHost
- com.ibm.CORBA.BootstrapPort
新しい INS ORB は、初期参照が定義されていない場合でもデフォルトの振る舞いを示さないという点で、大きく異なっています。
レガシー ORB では、ブートストラップ・ホストおよびポートの値は、localhost および 900 がデフォルトです。
レガシー ORB では、ブートストラップ・ホストおよびポートの値は、 your.server.name および 900 がデフォルトです。
すべての初期参照は、ブートストラップ・ホストおよびポートで稼働しているサーバーから取得されていました。このため、ORB ユーザーがブートストラップ・ホストおよびポートを提供しなかった場合、すべての初期参照は、ポート 900 のローカル・ホストで稼働しているサーバーから解決されます。INS ORB には、ブートストラップ・ホストまたはブートストラップ・ポートという概念はありません。すべての初期参照は、個別に定義されます。つまり、初期参照が異なる場合は、解決されるサーバーも異なります。If ORB.resolve_initial_references を呼び出したキーが、そのキーを持つ初期参照では ORB は初期化されないキーである場合、その呼び出しは失敗します。
バージョン 5 より前のリリースでは、プロバイダー URL が存在していない場合、その ORB の初期コンテキスト・ファクトリーは、 resolve_initial_references を呼び出していました。 デフォルトのブートストラップ・ホストおよびポートにあるネーム・サーバーが稼働している場合、このアクションは成功しました。現在のリリースの INS ORB では、失敗します。 (実際に、ORB は、使用が縮小されている期間中にレガシー・プロトコルに逆戻りしますが、レガシー・プロトコルがサポートされなくなると、この操作は失敗します。)
現在では、初期コンテキスト・ファクトリーは、デフォルトのプロバイダー URL の corbaloc:iiop:localhost:2809 を使用しており、プロバイダー URL で string_to_object を呼び出します。
現在のところ、 初期コンテキスト・ファクトリーは、 corbaloc:iiop:your.server.name:2809 を デフォルトのプロバイダー URL に使用しており、 このプロバイダー URL で string_to_object を呼び出しています。
この操作は、ピュア・クライアントが ORB ブートストラップのプロパティーまたはプロバイダー URL を設定しない場合、前のリリースのピュア・クライアントが経験した振る舞いを保持します。ただし、この異なる初期コンテキスト・ファクトリーの実装は、プロバイダー URL を指定しない、いくつかのレガシーのピュア・クライアントが経験する振る舞いを変更します。
- 初期コンテキストを取得するときに、前にリストした ORB ブートストラップのプロパティーを設定するクライアント。
- 独自の ORB インスタンスを InitialContext コンストラクターに提供するクライアント。
この振る舞いの変更を回避するには、次の 2 つの方法があります。
- 常に IIOP タイプのプロバイダー URL を指定する。このアプローチは、ブートストラップ・ホストおよびポートのプロパティーに依存せず、ブートストラップ・ホストおよびポートのプロパティーのサポートがなくなっても動作します。 例えば、それぞれブートストラップ・ホストおよびポートのプロパティー値の myHost および 2809 は、corbaloc:iiop:myHost:2809 として表すことができます。
- rir タイプのプロバイダー URL を使用する。
- ブートストラップ・サーバーとしてバージョン 5 サーバーを使用するよう ORB が初期化される場合は、corbaloc:rir:/NameServiceServerRoot を指定する。
- ブートストラップ・サーバーとしてバージョン 4.0.x サーバーを使用するよう ORB が初期化される場合は、corbaname:rir:/NameService#domain/legacyRoot を指定する。
- ブートストラップ・サーバーとしてバージョン 5 または 4.0.x サーバー以外のサーバーを使用するよう ORB が初期化される場合は、corbaloc:rir:/NameService を指定する。
このタイプの URL は、指定されたキーで ORB の resolve_initial_references を呼び出すことと等価です。 ブートストラップ・ホストおよびポートのプロパティーを使用して ORB を初 期化する場合は、ブートストラップ・ホストおよびポートのプロパティーがサ ポートされなくなると、このアプローチは機能しなくなります。
- InitialContext コンストラクターによる、JNDI のプロパティーの検索順序
このセクションの最初に示されているコードの断片をアプリケーションが実行する場合、ブートストラップ・サーバーは、プロパティー java.naming.provider.url の値に依存します。
このプロパティーが (システム・プロパティーとしてデフォルト値が設定 されているサーバー・プロセスで) 設定されていない場合は、デフォルトの ホストである localhost およびデフォルトのポートである 2809 が、初期コンテキストの取得先であるサーバーのアドレスとして使用されます。
このプロパティーが (システム・プロパティーとしてデフォルト値が設定 されているサーバー・プロセスで) 設定されていない場合は、デフォルトの ホストである your.server.name と デフォルトのポートである 2809 が、初期コンテキストの取得先サーバーのアドレスとして使用されます。
InitialContext のコンストラクターが java.naming.provider.url プロパティー設定を検索する場所は JNDI の仕様に記述されていますが、簡単に言えば、このプロパティーは、以下の順序で以下の場所から取り出されます。
- InitialContext コンストラクター
- 前の例では空の InitalContext コンストラクターを使用しているため、このコンストラクターは、前の例には当てはまりません。
- システム環境
- Java のコマンド呼び出し時に、プログラム・コードによって、 オプションとして JNDI のプロパティーをシステム環境に追加できます。システム環境にプロバイダー URL を設定するための推奨方法は、 Java コマンド起動にオプションとして指定することです。 この方法によるプロバイダー URL の設定は一時的なものではなく、 デフォルトの初期コンテキストを取得すると常に同じ結果になります。 通常は、 プログラム・コードでシステム環境にプロバイダー URL プロパティーを設定しないようにしてください。 これは、副次作用として、 同じプロセス内の他の場所で実行中の他のコード (おそらく関係がない) に悪影響を及ぼす可能性があるためです。
- jndi.properties ファイル
- クラス・ローダーの有効範囲内には jndi.properties ファイルが数多くあります。すべての jndi.properties ファイルは、JNDI プロパティーの設定に使用されますが、プロバイダー URL 設定は、クラス・ローダーによって戻される最初の jndi.properties ファイルによって決定されます。