Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第6章 アプリケーションの開発(Java言語)> 6.16 サーバアプリケーションのプログラミング例

6.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 -a Imple_POAsample5 -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)例外情報の獲得

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


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005