Interoperable Naming Service (INS) は、CosNaming サービスの拡張機能です。これには次のような機能が追加されています。
次の図は、INS がどのように ORBD に適合するかを示しています。
オブジェクト参照には、少なくとも、アドレス、オブジェクト参照を作成した POA の名前、およびオブジェクト ID という 3 つの情報が含まれています。
INS を使用すると、文字列化された Interoperable Object References (IOR) よりも読みやすい、CORBA オブジェクトにアクセスするための URL を提供できます。次のような文字列化されたオブジェクト参照形式を使用できます。
IOR は、オブジェクト参照であり、OMG によって定義された GIOP (General Inter-ORB Protocol) や IIOP (Internet Inter-ORB Protocol) を使用して情報をやりとりする ORB によって認識されます。クライアントは、「名前空間のブラウズ」の例に示すように、orb.object_to_string(objRef) を使用してオブジェクト参照を取得するか、または別のオブジェクト参照の呼び出しの結果として、オブジェクト参照を取得できます。
corbaloc と corbaname の形式を使用すると、CORBA オブジェクトにアクセスするための URL を提供できます。corbaloc 形式は、ネームサービスを経由しないで、特定の CORBA サービスを解決する場合に使用します。corbaname 形式は、特定のネーミングコンテキストの文字列化された名前を解決する場合に使用します。
corbaloc: 形式は、CORBA クライアントにとって有効な形式で、CORBA サービスを探すために使用されます。この形式は、一般的に、GIOP の LocateRequest メッセージまたは Request メッセージを使用して、参照を解決するために使用されます。たとえば、corbaloc: オブジェクト参照は、次のようになります。
corbaloc:iiop:1.2@example.com:2050/TraderService
この例は、ホスト example.com のポート 2050 から TraderService のオブジェクト参照を取得する方法を示しています。
注: URL の例の 1.2 は、corbaloc URL に対応する IOR の GIOP バージョン 1.2 を意味します。GIOP 1.2 は、Sun の Java CORBA ORB のデフォルト値です。この例では、異なるバージョンを関連付ける方法を示すために使われています。
corbaname: 形式は、クライアントが直接ブートストラップするためのメカニズムを提供するもので、一般的に、ルートネーミングコンテキストの文字列化された名前を解決するために使用されます。たとえば、corbaname: オブジェクト参照は、次のようになります。
corbaname::example.com:2050#Personal/schedule
example.com はホストで、2050 はポートです。ハッシュマークまでの部分の参照 (corbaname::example.com:2050) は、ルートネーミングコンテキストを返す URL です。この例は、a) ネームサービスを探し、b) ネームサービスの Personal/schedule という名前を解決するために使用される URL を示しています。
NamingContext から派生した NamingContextExt インタフェースは、URL と文字列化された名前を使用するために必要な操作を提供します。CosName、文字列化された名前、および URL 間の変換に使用する NamingContextExt API をいくつか次に示します。これらの API の詳細については、COS Naming Specification のセクション 3.6.4 を参照してください。
このオペレーションは、Name を受け取り、文字列化された名前を返します。Name が無効な場合は、InvalidName 例外が発生します。
このオペレーションは、文字列化された名前を受け取り、Name を返します。文字列化された名前が、構文的に間違っているか、または実装の制限に適合していない場合は、InvalidName 例外が発生します。
NamingContext.resolve() と同じ方法で解決を実行する便利なオペレーションです。このオペレーションは、Name ではなく、文字列化された名前を引数として受け取ります。
このオペレーションは、次のような corbaloc URL <address> と <key_string> コンポーネントを最初のパラメータとして取ります。
さらに 2 つ目のパラメータとして文字列化された名前を取ります。このオペレーションは、パラメータ上の必要なエスケープをすべて実行し、完全な形式の URL 文字列を返します。corbaloc アドレス、キーパラメータ、名前パラメータのどれかに間違いがあると、例外が発生します。
stringified_name は空にすることもできます。アドレスが空の場合は、InvalidAddress 例外が発生します。
URL からオブジェクトへの変換は、CORBA 2.3 仕様のセクション 13.6.6 に記載されているように、org.omg.CORBA.ORB.string_to_object() によって処理されます。
次の Java IDL チュートリアルでは、NamingContextExt を使用します。
ORBInitRef または ORBDefaultInitRef を使用すると、resolve_initial_references() からカスタマイズされた CORBA サービスのハンドルを返すように ORB を構成できます。次に例を示します。
-ORBInitRef TraderService=corbaloc::example.com:2050/TraderService
-ORBDefaultInitRef corbaloc:iiop:1.2:example.com:2050
これらのオプションを使用した場合、解決の順番は次のようになります。
INS の詳細については、INS ネーミング仕様を参照してください。
このドキュメントでは、Interoperable Naming Service (INS) を使用して完全な CORBA (Common Object Request Broker Architecture) アプリケーションを作成する方法の高レベルな概要について説明します。
この例では、次のファイルを使用します。
チュートリアルの各手順はこの記号によって示します。
Service.idl
)CORBA アプリケーション作成の第一段階は、OMG のインタフェース定義言語 (IDL) を使って、オブジェクトとインタフェースをすべて記述することです。
次のコードは OMG IDL で記述されたもので、CORBA オブジェクトの ping() オペレーションが INS Service に対する ping を実行しています。
Service.idl ファイルを作成し、次のコードを追加します。
Service.idl
// A very simple interface to explain this example interface Service { void ping(); };
INSServer.java
)INSServer クラスには、次を実行するサーバーの main() メソッドが含まれます。
INSServer.java ファイルを作成し、次のコードを追加します。
INSServer.java
// INSServer.java // Copyright and License import java.util.Properties; import org.omg.CORBA.Object; import org.omg.CORBA.ORB; import org.omg.CORBA.Policy; import org.omg.PortableServer.POA; import org.omg.PortableServer.*; import org.omg.PortableServer.Servant; public class INSServer { public static void main( String args[] ) { try { Properties properties = System.getProperties( ); // STEP 1: Set ORBPeristentServerPort property // Set the proprietary property to open up a port to listen to // INS requests. // Note: This property is subject to change in future releases properties.put( "com.sun.CORBA.POA.ORBPersistentServerPort", Integer.toString(1060) ); // STEP 2: Instantiate the ORB, By passing in the // ORBPersistentServerPort property set in the previous step ORB orb = ORB.init( args, properties ); // STEP 3: Instantiate the Service Object that needs to be published // and associate it with RootPOA. ServiceImpl servant = new ServiceImpl( ); POA rootPOA = POAHelper.narrow( orb.resolve_initial_references( "RootPOA" )); rootPOA.the_POAManager().activate(); rootPOA.activate_object( servant ); // STEP 4: Publish the INS Service using // orb.register_initial_reference( <ObjectKey>, <ObjectReference> // NOTE: Sun private internal API, not part of CORBA 2.3.1. // May move as our compliance with OMG standards evolves. ((com.sun.corba.se.internal.Interceptors.PIORB) orb). register_initial_reference( "PingService", rootPOA.servant_to_reference(servant) ); System.out.println( "INS Server is Ready..." ); // STEP 5: We are ready to receive requests orb.run( ); } catch ( Exception e ) { System.err.println( "Error in setup : " + e ); } } }
ServiceImpl.java
)実装例 ServiceImpl は、Service IDL インタフェースの実装です。
ServiceImpl.java ファイルを作成し、次のコードを追加します。
ServiceImpl.java
// ServiceImpl.java // Copyright and License // Implementation of Service interface public class ServiceImpl extends ServicePOA { public void ping( ) { System.out.println( "PingService.ping called..." ); } }
INSClient.java
)このアプリケーションクライアントでは、次の処理を行います。
INSClient.java ファイルを作成し、次のコードを追加します。
INSClient.java
// INSClient.java // Copyright and License import org.omg.CORBA.ORB; public class INSClient { public static void main( String args[] ) { try { // STEP 1: Instantiate the ORB ORB orb = ORB.init( args, null ); // STEP 2: Resolve PingService using orb.resolve_initial_references() // In this example we have used -ORBInitRef argument to locate the // PingService. User can also choose to pass the corbaloc: url to // orb.string_to_object to resolve the published PingService // reference. org.omg.CORBA.Object object = orb.resolve_initial_references( "PingService" ); // STEP 3: Narrow the reference and we are ready to invoke method // on PingService. Service insService = ServiceHelper.narrow( object ); insService.ping( ); System.out.println( "The server has been pinged" ); } catch ( Exception e ) { System.err.println( "Exception in INSClient " + e ); e.printStackTrace( ); } } }
この例を実行する場合は、1024 以上のポート番号を使用することをお勧めします。これは、Solaris を使う場合、1024 より小さいポート番号でプロセスを起動するときに、root としてアクセスする必要があるためです。この例では、サーバーの ORBPersistentServerPort プロパティーを 1060 に設定しています。
Service.idl ファイルが置かれているディレクトリに移動し、次のように IDL-to-Java コンパイラを実行します。
idlj -fall Service.idl
idlj コンパイラの -fall オプションを使って、クライアントとサーバー側のバインディングの両方を生成する必要があります。idlj オプションの詳細については、IDL-to-Java コンパイラオプションを参照してください。
Service.idl の idlj コンパイラで、-fall コマンド行オプションを使って生成されるファイルは次のとおりです。
次のようにして、スタブとスケルトンも含め、.java ファイルをコンパイルします。
javac *.java
INS サーバーを起動します。
java -classpath . INSServer
INS サーバーが正しく実行されると、次のメッセージが表示されます。
INS Server is Ready...
別の端末ウィンドウまたは DOS シェルを開き、クライアントアプリケーションを実行します。
java -classpath . INSClient -ORBInitRef PingService=corbaloc:iiop:1.2@localhost:1060/PingService
-ORBInitRef オプションを使用してクライアントを実行すると、PingService を見つけることができます。クライアントウィンドウに次のメッセージが表示されます。
The server has been pinged
サーバーウィンドウに次のメッセージが表示されます。
PingService.ping called...
このチュートリアルを終了したら、INS サーバーを停止するか終了してください。DOS プロンプトからこれを実行するには、サーバーを実行しているウィンドウを選択して Ctrl+C と入力すると停止します。Unix シェルでは、クライアントを実行していたシェルを開き、pkill INSServer と入力します。