Java IDL: Interoperable Naming Service (INS) の例

Interoperable Naming Service (INS) は、CosNaming サービスの拡張機能です。これには次のような機能が追加されています。

次の図は、INS がどのように ORBD に適合するかを示しています。

ORBD



オブジェクト参照には、少なくとも、アドレス、オブジェクト参照を作成した POA の名前、およびオブジェクト ID という 3 つの情報が含まれています。

INS を使用すると、文字列化された Interoperable Object References (IOR) よりも読みやすい、CORBA オブジェクトにアクセスするための URL を提供できます。次のような文字列化されたオブジェクト参照形式を使用できます。

NamingContextExt API

NamingContext から派生した NamingContextExt インタフェースは、URL と文字列化された名前を使用するために必要な操作を提供します。CosName、文字列化された名前、および URL 間の変換に使用する NamingContextExt API をいくつか次に示します。これらの API の詳細については、COS Naming Specification のセクション 3.6.4 を参照してください。

URL からオブジェクトへの変換は、CORBA 2.3 仕様のセクション 13.6.6 に記載されているように、org.omg.CORBA.ORB.string_to_object() によって処理されます。

次の Java IDL チュートリアルでは、NamingContextExt を使用します。

ORB のブートストラップオプション

ORBInitRef または ORBDefaultInitRef を使用すると、resolve_initial_references() からカスタマイズされた CORBA サービスのハンドルを返すように ORB を構成できます。次に例を示します。

これらのオプションを使用した場合、解決の順番は次のようになります。

  1. register_initial_references に登録されたオブジェクト
  2. -ORBInitRef
  3. -ORBDefaultInitRef
  4. 独自のブートストラップ (Sun ORB のみ)

INS の詳細については、INS ネーミング仕様を参照してください。


INS の例: INS URL によってアクセスされる参照の公開

このドキュメントでは、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( );
        }
    }
}
 

INS 構築方法と実行方法の例

この例を実行する場合は、1024 以上のポート番号を使用することをお勧めします。これは、Solaris を使う場合、1024 より小さいポート番号でプロセスを起動するときに、root としてアクセスする必要があるためです。この例では、サーバーの ORBPersistentServerPort プロパティーを 1060 に設定しています。

インタフェース定義のコンパイル

ステップService.idl ファイルが置かれているディレクトリに移動し、次のように IDL-to-Java コンパイラを実行します。

  idlj -fall  Service.idl

idlj コンパイラの -fall オプションを使って、クライアントとサーバー側のバインディングの両方を生成する必要があります。idlj オプションの詳細については、IDL-to-Java コンパイラオプションを参照してください。

Service.idlidlj コンパイラで、-fall コマンド行オプションを使って生成されるファイルは次のとおりです。

Java ファイルのコンパイル

ステップ 次のようにして、スタブとスケルトンも含め、.java ファイルをコンパイルします。

   javac *.java 

INS サーバーの起動

ステップ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 と入力します。


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.