7.4.5 オブジェクトの非活性化

POAはアクティブオブジェクトマップからサーバントを削除できます。例えば,これはガーベッジコレクション手法の一形態として行います。サーバントをマップから削除すると,そのサーバントは非活性化されます。deactivate_object()メソッドを使用してオブジェクトを非活性化できます。オブジェクトを非活性化すると,このオブジェクトが永遠に失われるということではありません。あとで再度活性化できます。

コードサンプル7-11 オブジェクトの非活性化例(C++)

// DeActivatorThread
class DeActivatorThread: public VISThread {
  private :
     PortableServer::ObjectId _oid;
     PortableServer::POA_ptr _poa;

  public :
     virtual ~DeActivatorThread(){}
     // Constructor
     DeActivatorThread(const PortableServer::ObjectId& oid,
           PortableServer::POA_ptr poa ): _oid(oid),
           _poa(poa) {
        // start the thread
        run();
     }

     // implement begin() callback
     void begin() {
        // Sleep for 15 seconds
        VISPortable::vsleep(15);

        CORBA::String_var s =
           PortableServer::ObjectId_to_string (_oid);
        // Deactivate Object
        cout << "¥nDeactivating the object with ID =
           " << s << endl;
        if ( _poa )
           _poa->deactivate_object( _oid );
     }
};

// Servant Activator
class AccountManagerActivator :
     public PortableServer::ServantActivator {
  public:
     virtual PortableServer::Servant incarnate
           (const PortableServer::ObjectId& oid,
           PortableServer::POA_ptr poa) {
        CORBA::String_var s =
           PortableServer::ObjectId_to_string (oid);
        cout << "¥nAccountManagerActivator.incarnate called
           with ID = " << s << endl;
        PortableServer::Servant servant;

        if ( VISPortable::vstricmp( (char *)s,
              "SavingsAccountManager" ) == 0 )
           // Create CheckingAccountManager Servant
           servant = new SavingsAccountManagerImpl;
        else if ( VISPortable::vstricmp( (char *)s,
              "CheckingAccountManager" ) == 0 )
           // Create CheckingAccountManager Servant
           servant = new CheckingAccountManagerImpl;
        else
           throw CORBA::OBJECT_NOT_EXIST();
        // Create a deactivator thread
        new DeActivatorThread( oid, poa );
        // return the servant
        servant->_add_ref();
        return servant;
     }

     virtual void etherealize (
              const PortableServer::ObjectId& oid,
           PortableServer::POA_ptr adapter,
           PortableServer::Servant servant,
           CORBA::Boolean cleanup_in_progress,
           CORBA::Boolean remaining_activations) {
     // If there are no remaining activations i.e ObjectIds
     // associated with the servant delete it.

     CORBA::String_var s =
           PortableServer::ObjectId_to_string (oid);
     cout << "¥nAccountManagerActivator.etherealize called
           with ID = " << s << endl;
     if (!remaining_activations)
        delete servant;
  }
};

コードサンプル7-12 オブジェクトの非活性化例(Java)

import org.omg.PortableServer.*;
public class AccountManagerActivator extends
                                      ServantActivatorPOA {
  public Servant incarnate (
           byte[ ] oid, POA adapter) throws ForwardRequest {
     Servant servant;
     String accountType = new String(oid);
     System.out.println(
       "¥nAccountManagerActivator. incarnate
        called with ID = " + accountType + "¥n");
     // Create Savings or Checking Servant based on
     // AccountType
     if (accountType.equalsIgnoreCase(
                                  "SavingsAccountManager"))
        servant = (Servant )new SavingsAccountManagerImpl();
     else
        servant = (Servant)new CheckingAccountManagerImpl();
        new DeactivateThread(oid, adapter).start();
        return servant;
     }
     public void etherealize (byte[ ] oid,
           POA adapter,
           Servant serv,
           boolean cleanup_in_progress,
           boolean remaining_activations) {
        System.out.println(
          "¥nAccountManagerActivator.etherealize
           called with ID = " + new String(oid) + "¥n");
        System.gc();
     }
}
class DeactivateThread extends Thread {
  byte[ ] _oid;
  POA _adapter;
  public DeactivateThread(byte[ ] oid, POA adapter) {
     _oid = oid;
     _adapter = adapter;
  }
  public void run() {
     try {
        Thread.currentThread().sleep(15000);
        System.out.println(
                   ¥nDeactivating the object with ID = " +
                   new String(_oid) + "¥n");
        _adapter.deactivate_object(_oid);
  } catch (Exception e) {
    e.printStackTrace();
  }
}
}