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は、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: Oracle Java 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のオプションの詳細は、idljのマニュアル・ページ(Solaris、Linux、Mac OS XまたはWindows)を参照してください。
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と入力すると停止します。Solaris、LinuxまたはMac OS Xのシェルでは、クライアントを実行していたシェルを開き、pkill INSServerと入力します。