サービス活性化の主な用途は,サーバ内で多数のオブジェクトがアクティブであるような錯覚を与えることです。実際には少数のオブジェクトだけがアクティブです。このモデルをサポートするには,サーバは一時的にオブジェクトを使用できないようにする必要があります。マルチスレッドDBActivatorのサンプルプログラムには,30秒ごとにすべてのDBObjectImplを非活性化するリーパスレッドがあります。DBActivatorは,deactivateメソッドが起動されるとオブジェクトリファレンスを解放します。新しいクライアントリクエストが非活性化オブジェクトに到着すると,VisiBroker ORBはオブジェクトを再起動しなければならないことをActivatorに通知します。
//static sequence of currently active Implementations
static VISMutex _implMtx;
static DBObjectSequence _impls;
//updated DBActivator to store activated implementations
//in the global sequence.
class DBActivator: public extension::Activator {
virtual CORBA::Object_ptr activate(
CORBA::ImplementationDef_ptr impl) {
extension::ActivationImplDef* actImplDef =
extension::ActivationImplDef::_downcast(impl);
CORBA::ReferenceData_var id(actImplDef->id());
DBObjectImpl *obj = new DBObjectImpl(
(char *)id->data(), id);
VISMutex_var lock(_implMtx);
_impls.length(_impls.length() + 1);
_impls[_impls.length()-1] = DBObject::_duplicate(obj);
return obj;
}
virtual void deactivate(CORBA::Object_ptr,
CORBA::ImplementationDef_ptr impl) {
obj->_release();
}
};
// Multi-threaded Reaper for destroying all activated
// objects every 30 seconds.
class DBObjectImplReaper : public VISThread {
public:
// Reaper methods
virtual void start() {
run();
}
virtual CORBA::Boolean startTimer() {
vsleep(30);
return 1;
}
virtual void begin() {
while (startTimer()) {
doOneReaping();
}
}
protected:
virtual void doOneReaping() {
VISMutex_var lock(_implMtx);
for (CORBA::ULong i=0; i < _impls.length(); i++) {
// assigning nil into each element will release
// the reference stored in the _var
DBObject_var obj = DBObject::_duplicate(_impls[i-1];
_impls[i] = DBObject::_nil();
CORBA::BOA_var boa = obj->_boa();
boa->deactivate_obj(obj);
}
_impls.length(0);
}
};