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