Java IDL: Interoperable Naming Service (INS) の例


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

次の図は、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 の詳細については、OMG 仕様 (ptc/00-08-07) を参照してください。


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() メソッドが含まれます。この 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 © 1995-2001 Sun Microsystems, Inc. All Rights Reserved.