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

5.16.8 Active Object Map(AOM)使用例(Factory-1方式+インスタンス解放)

(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 username );
        void   destroy( in  intf  obj ); 
    };
};

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

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

(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::POAsample5" ); 
            String NCkind = new String( "" ); 
            NameComponent nc =  new NameComponent( NCid, NCkind ); 
            NameComponent NCo[] = { nc }; 
            org.omg.CORBA.Object  Obj = Cos.resolve( NCo ); 

            // Factoryのオブジェクトリファレンスの獲得
            Factory target = FactoryHelper.narrow( Obj ); 
  
            int  in; 
            String line = null; 
  
            try {
                // ユーザIDの入力
                System.out.print( "Input your Name => " ); 
                line = new BufferedReader( new InputStreamReader( System.in ) ).readLine();
                if( line.length() == 0 ) {
                    line = new String( "guest" ); 
                }

                // Factoryでインタフェース用オブジェクトリファレンス作成
                intf _intf = target.create( line ); 

                // サーバアプリケーションのメソッド呼出し
                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() ); 
            }
            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 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 ); 

            // FactoryServantの生成
            Servant svt = new FactoryServant( rootPOA ); 

            // Factoryインタフェース用POAをDefault Servantに設定
            factory_POA.set_servant( svt ); 

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

            // インスタンス解放処理の登録
            com.fujitsu.ObjectDirector.PortableServer.POAdisconnect clrel = new instrelease();
            clrel.setDisconnect( clrel ); 

            // 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
{
    private POA poa = null; 
    static public java.util.Hashtable table; 

    // コンストラクタ
    public FactoryServant() {
        table = new java.util.Hashtable();
    }
    public FactoryServant( POA param_poa ) {
        this();
        poa = param_poa; 
    }

    public intf create( String UserName ) 
    {
        intf ior; 

        try {
            // Servantの検索
            Servant svt = (Servant)table.get( UserName ); 

            // みつからない場合、Servantを作成(guestは毎回作成)
            if( null == svt ) {
                svt = new UserServant( UserName ); 
                table.put( UserName, svt ); 

                // インスタンス数が100を超えるようならば無条件解放に変更する
                if( table.size() > 100 ) {
                    com.fujitsu.ObjectDirector.PortableServer.POAdisconnect clrel =
                        new ALLinstrelease();
                    clrel.resetDisconnect( clrel ); 
                }
            }

            // Servantからオブジェクトリファレンスの生成
            // IMPLICIT_ACTIVATIONポリシを指定しているので、AOMへ自動登録される
            org.omg.CORBA.Object _tmpObj = this.poa.servant_to_reference( svt ); 
            ior = intfHelper.narrow( _tmpObj ); 
        } 
        catch( org.omg.CORBA.UserException e ) {
            System.out.println( "create error: " + e ); 
            e.printStackTrace(System.err); 
            throw new org.omg.CORBA.COMM_FAILURE();
        }

        return( ior ); 
    }

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

            // Servantをdeactiveにする
            this.poa.deactivate_object( oid ); 
        }
        catch( org.omg.CORBA.UserException e ) {
            System.out.println( "destroy error: " + e ); 
        }
    }
}

// Servant:メソッド実装クラス(スケルトンを継承)
class UserServant extends intfPOA
{
    private int    value = 0; 
    public String UserName = null; 

    public UserServant( String UserName ) {
        this.UserName = UserName; 
    }

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

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

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

}

// 条件付きインスタンス解放クラス(POAdisconnectを継承)
class instrelease
    extends com.fujitsu.ObjectDirector.PortableServer.POAdisconnect {

    public boolean release_instance( org.omg.PortableServer.POA        POA, 
                                     org.omg.PortableServer.Servant servant, 
                                     byte[]                            oid ) {

        UserServant svt = (UserServant)servant; 
        if( svt.UserName.equals( "guest" ) ) {
            FactoryServant.table.remove( svt.UserName ); 
            return true; 
        }

        return false; 
    }
}

// 無条件インスタンス解放クラス(POAdisconnectを継承)
class ALLinstrelease
    extends com.fujitsu.ObjectDirector.PortableServer.POAdisconnect {

    public boolean release_instance( org.omg.PortableServer.POA        POA, 
                                     org.omg.PortableServer.Servant servant, 
                                     byte[]                            oid ) {

        UserServant svt = (UserServant)servant; 

        FactoryServant.table.remove( svt.UserName ); 

        return true; 
    }
}

(6)例外情報の獲得

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