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. 独自のブートストラップ(Oracle 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: 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( );
        }
    }
}
 

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

この例を実行する場合は、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.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と入力すると停止します。Solaris、LinuxまたはMac OS Xのシェルでは、クライアントを実行していたシェルを開き、pkill INSServerと入力します。


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