(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.10 クライアントアプリケーションの例外処理”を参照してください。