ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

5.19.4 Servant Locator使用例 (ユーザインスタンス管理方式)

(1)IDL定義

module ODsample{
    interface    intf{
        readonly  attribute  long  value; 
        void add( in  long  a ); 
        void sub( in  long  b ); 
    };
    interface Factory{
        intf   create( in  string  userid ); 
        void   destroy( in  intf  obj ); 
    };
};

(2)ネーミングサービスの登録

OD_or_adm -c IDL:ODsample/Factory:1.0 -n ODsample::POAsample4

(3)アプリケーション構成概要図



(4)クライアントアプリケーション

import java.io.*;
import org.omg.CORBA.*; 
import org.omg.CosNaming.*; 
import ODsample.*; 

public class Client {
    public static void main( String args[] ) {

        try {
            // ORBの生成と初期化
            ORB Orb = ORB.init( args, null ); 

            // ネーミングサービスのオブジェクトリファレンスの取得
            org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "NameService" ); 
            NamingContextExt Cos = NamingContextExtHelper.narrow( _tmpObj ); 

            // ネーミングサービスのresolveメソッドを発行し、
            // サーバアプリケーションのオブジェクトリファレンスの獲得
            String NCid = new String( "ODsample::POAsample4" ); // オブジェクト名
            String NCkind = new String( "" );                   // オブジェクトタイプ
            NameComponent nc =  new NameComponent( NCid, NCkind ); 
            NameComponent NCo[] = { nc };
            org.omg.CORBA.Object  Obj = Cos.resolve( NCo ); 

            // サーバアプリケーションのインタフェースクラスの獲得
            Factory target = FactoryHelper.narrow( Obj ); 

            int  in; 
            String line = null; 
            String userid = null; 

            try {
                System.out.print( "USERID => " ); 
                userid = new BufferedReader( new InputStreamReader( System.in ) ).readLine();
                if( userid.length() == 0 ) 
                    System.exit( 255 ); 

                // FactoryでインタフェースアプリのIORを作成する
                intf _intf = target.create( userid ); 

                // サーバアプリケーションのメソッド呼出し
                System.out.println( "value = " + _intf.value() ); 

                System.out.print( "add => " ); 
                line =  new BufferedReader( new InputStreamReader( System.in ) ).readLine();
                in = Integer.parseInt( line ); 

                // サーバアプリケーションのメソッド呼出し
                _intf.add( in ); 
                System.out.println( "value = " + _intf.value() ); 

                System.out.print( "sub => " ); 
                line = new BufferedReader( new InputStreamReader( System.in ) ).readLine();
                in = Integer.parseInt( line ); 

                // サーバアプリケーションのメソッド呼出し
                _intf.sub( in ); 
                System.out.println( "value = " + _intf.value() ); 

                target.destroy( _intf ); 
            }
            catch ( java.lang.NumberFormatException e ) {
                System.exit(255); 
            }
        }
        catch( org.omg.CORBA.SystemException se ) {
            System.out.println( "ERROR : " + se.getClass().getName()
                 + " : minor = 0x" + java.lang.Integer.toHexString(se.minor) );
             System.exit( 255 );
        }
        catch( org.omg.CORBA.UserException ue ) {
            System.out.println( "ERROR : " + ue.getClass().getName() );
            System.exit( 255 );
        }
        catch ( Exception e ) {
            System.err.println( "ERROR : " + e ); 
            System.exit( 255 ); 
        }
    }
}

(5)サーバアプリケーション

import org.omg.CORBA.*; 
import org.omg.PortableServer.*; 
import java.util.*; 
import ODsample.*; 

// ユーザアプリケーション:メイン処理クラス
public class Server {
    public static void main( String args[] ) {

        try {
            // ORBの生成と初期化
            ORB Orb = ORB.init( args, null ); 

            // RootPOAのオブジェクトリファレンスの取得
            org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "RootPOA" ); 
            // RootPOAのPOAオブジェクト獲得
            POA rootPOA = POAHelper.narrow( _tmpObj ); 

            // Factoryインタフェース用のPOA作成
            // ポリシリスト作成
            org.omg.CORBA.Policy factory_policies[] = new org.omg.CORBA.Policy[4]; 
            factory_policies[0] = rootPOA.create_servant_retention_policy(
                                  ServantRetentionPolicyValue.NON_RETAIN ); 
            factory_policies[1] = rootPOA.create_request_processing_policy(
                                  RequestProcessingPolicyValue.USE_DEFAULT_SERVANT ); 
            factory_policies[2] = rootPOA.create_id_assignment_policy(
                                  IdAssignmentPolicyValue.SYSTEM_ID ); 
            factory_policies[3] = rootPOA.create_id_uniqueness_policy(
                                  IdUniquenessPolicyValue.MULTIPLE_ID ); 
            POA factory_POA = rootPOA.create_POA( "IDL:ODsample/Factory:1.0",
                                                  null, 
                                                  factory_policies ); 

            // インタフェース用のPOA作成
            // ポリシリスト作成
            org.omg.CORBA.Policy inf_policies[] = new org.omg.CORBA.Policy[4]; 
            inf_policies[0] = rootPOA.create_servant_retention_policy(
                              ServantRetentionPolicyValue.NON_RETAIN ); 
            inf_policies[1] = rootPOA.create_request_processing_policy(
                              RequestProcessingPolicyValue.USE_SERVANT_MANAGER ); 
            inf_policies[2] = rootPOA.create_id_assignment_policy(
                              IdAssignmentPolicyValue.USER_ID ); 
            inf_policies[3] = rootPOA.create_id_uniqueness_policy(
                              IdUniquenessPolicyValue.UNIQUE_ID ); 
            String inf_adapter_name = "IDL:ODsample/intf:1.0"; //インタフェースリポジトリID
            POA childPOA = rootPOA.create_POA( "childPOA", null, inf_policies ); 

            // FactoryServantの生成
            Servant svt = new FactoryServant( childPOA ); 
            // Factoryインタフェース用POAのDefault Servantに設定
            factory_POA.set_servant( svt ); 

            // ServantLocatorの生成
            ServantLocator svtloc = new UserServantLocator();
            // インタフェース用POAにServantManagerとして登録
            childPOA.set_servant_manager( svtloc ); 

            // POAマネージャの獲得
            POAManager poamanager = rootPOA.the_POAManager();

            // POAマネージャのactivate
            poamanager.activate();
            Orb.run();
        }
        catch( org.omg.CORBA.SystemException se ) {
            System.out.println( "ERROR : " + se.getClass().getName()
                 + " : minor = 0x" + java.lang.Integer.toHexString(se.minor) );
             System.exit( 255 );
        }
        catch( org.omg.CORBA.UserException ue ) {
            System.out.println( "ERROR : " + ue.getClass().getName() );
            System.exit( 255 );
        }
        catch ( Exception e ) {
            System.err.println( "ERROR : " + e ); 
            System.exit( 255 ); 
        }
    }
}

// FactoryServant:Factoryメソッド実装クラス(スケルトンを継承)
class FactoryServant extends FactoryPOA {

    static java.util.Hashtable tbl = new java.util.Hashtable();  // 管理テーブル
    private POA poa = null; 

    // コンストラクタ
    public FactoryServant( POA poa ) {
        this.poa = poa; 
    }

    public intf create( java.lang.String userid ) {
        intf       ior;   // UserServantのオブジェクトリファレンス

        // オブジェクトリファレンスの生成
        org.omg.CORBA.Object _tmpObj = this.poa.create_reference_with_id(
              userid.getBytes(),
              "IDL:ODsample/intf:1.0" );
        ior = intfHelper.narrow( _tmpObj );

        return( ior );

    }

    public void destroy( intf obj ) 
    {
        try{
            // オブジェクトリファレンスからオブジェクトIDを求める
            byte oid[] = this.poa.reference_to_id( obj ); 

            // Servantを管理テーブルから削除
            FactoryServant.tbl.remove(  new ObjKey( oid )  ); 
        }
        catch( org.omg.CORBA.UserException e ) {
            System.err.println( "destroy error: " + e ); 
        }
    }
}

// Servantロケータ:Servant生成クラス(ServantLocatorを継承)
class UserServantLocator extends LocalObject implements ServantLocator {

    public Servant preinvoke(
               byte[] oid, 
               org.omg.PortableServer.POA adapter, 
               java.lang.String operation, 
               org.omg.PortableServer.ServantLocatorPackage.CookieHolder cookie ) {

        // Servantを検索する。みつからなければnewで生成する
        Servant svt =  (Servant)FactoryServant.tbl.get( new ObjKey( oid ) ); 
        if ( svt == null ) {
            svt = new UserServant();
            FactoryServant.tbl.put( new ObjKey(oid), svt ); 
        }

        // Cookieの作成
        cookie.value = new ObjKey(oid); 

        return( svt ); 
    }

    public void postinvoke( byte[] oid, 
                          org.omg.PortableServer.POA adapter, 
                          java.lang.String operation, 
                          java.lang.Object cookie, 
                          Servant the_servant ) {

        // 変数の初期化を行う。
        the_servant = null; 
    }
}

// ObjKey
class ObjKey{
    private byte[]  key; 

    public ObjKey( byte[] _key ) {
        key = _key; 
    }

    public int hashCode() {
        return (int)key[0]; 
    }

    public boolean equals( java.lang.Object comp ) {
        int i = key.length; 
        if ( i != ((ObjKey)comp).key.length ) {
            return false; 
        }
        for ( i--; i>=0; i-- ) {
            if ( key[i] != ((ObjKey)comp).key[i] ) {
                return false; 
            }
        }

        return true; 
    }
}

// Servant:メソッド実装クラス(スケルトンを継承)
class UserServant extends intfPOA {

    private int    value = 0; 

    public int value() {
        return( this.value ); 
    }

    public void add( int a ) {
        this.value += a; 
    }

    public void sub( int b ) {
        this.value -= b; 
    }
}

(6)例外情報の獲得

サーバアプリケーションで例外を獲得する方法は、クライアントアプリケーションの例外処理と同様です。詳細については、“5.10 クライアントアプリケーションの例外処理”を参照してください。