29.3.3 サービス活性化オブジェクトインプリメンテーションの非活性化(C++)

サービス活性化の主な用途は,サーバ内で多数のオブジェクトがアクティブであるような錯覚を与えることです。実際には少数のオブジェクトだけがアクティブです。このモデルをサポートするには,サーバは一時的にオブジェクトを使用できないようにする必要があります。マルチスレッドDBActivatorのサンプルプログラムには,30秒ごとにすべてのDBObjectImplを非活性化するリーパスレッドがあります。DBActivatorは,deactivateメソッドが起動されるとオブジェクトリファレンスを解放します。新しいクライアントリクエストが非活性化オブジェクトに到着すると,VisiBroker ORBはオブジェクトを再起動しなければならないことをActivatorに通知します。

コードサンプル29-14 サービス活性化オブジェクトインプリメンテーションを非活性化する例

//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);
     }
};

マルチスレッドが_implsデータ構造にアクセスしているコードの部分は,排他を提供するためにVISMutexによって保護されています。