29.2 アクティベータインタフェース

ユーザは,独自のインタフェースをActivatorクラス(C++)またはActivatorインタフェース(Java)から派生させることができます。これによってユーザはVisiBroker ORBがAccountImplオブジェクト(C++)またはDBObjectImplオブジェクト(Java)で使用する純仮想(C++)activateおよびdeactivateメソッドをインプリメントできます。次に,ユーザはBOAがオブジェクトに対する要求を受け取るまで,AccountImplオブジェクトの実体化を遅延させることができます。また,BOAがオブジェクトを非活性化する場合に,クリーンアップ処理を提供できるようになります。

コードサンプル29-1にActivatorクラス(C++),コードサンプル29-2にActivatorインタフェース(Java)を示します。これは,VisiBroker ORBオブジェクトを活性化,非活性化するためにBOAが呼び出すメソッドを提供します。

コードサンプル29-1 Activatorクラス(C++)

class Activator {
  public:
     virtual CORBA::Object_ptr activate(
           extension::ImplementationDef impl) = 0;
     virtual void deactivate(
           Object_ptr, extension::ImplementationDef_ptr impl)
           = 0;
};

コードサンプル29-2 Activatorインタフェース(Java)

package com.inprise.vbroker.extension;
public interface Activator {
  public abstract org.omg.CORBA.Object
                           activate(ImplementationDef impl);
  public abstract void deactivate(org.omg.CORBA.Object obj,
                                  ImplementationDef impl);
}

コードサンプル29-3にAccountImplインタフェースに対してActivatorを生成する方法を示します。

コードサンプル29-3 activateおよびdeactivateメソッドをインプリメントしてDBActivatorクラス(C++)を派生

class extension {
  . . .
  class AccountImplActivator : public extension::Activator {
     public:
        virtual CORBA::Object_ptr activate(
              CORBA::ImplementationDef_ptr impl);
        virtual void deactivate(CORBA::Object_ptr,
              CORBA::ImplementationDef_ptr impl);
  };
  CORBA::Object_ptr AccountImplActivator::activate(
        CORBA::ImplementationDef_ptr impl) {
     // When the BOA needs to activate us,
     // instantiate the AccountImpl object.
     extension::ActivationImplDef* actImplDef =
             extension::ActivationImplDef::_downcast(impl);
     CORBA::Object_var obj =
             new AccountImpl(actImplDef->object_name());
     return CORBA::_duplicate(obj);
  }
  void AccountImplActivator::deactivate(CORBA::Object_ptr obj,
        CORBA::ImplementationDef_ptr impl) {
     // When the BOA deactivates us, release the Account object.
     obj->_release;
  }
}

コードサンプル29-4にDBObjectImplインタフェースに対してActivatorを生成する方法を示します。

コードサンプル29-4 activateおよびdeactivateメソッドをインプリメントしてDBActivatorインタフェース(Java)を派生

// Server.java
import com.inprise.vbroker.extension.*;
. . .
class DBActivator implements Activator {
  private static int _count;
  private com.inprise.vbroker.CORBA.BOA _boa;

  public DBActivator(com.inprise.vbroker.CORBA.BOA boa) {
     _boa = boa;
  }
  public org.omg.CORBA.Object activate(
      com.inprise.vbroker.extension.ImplementationDef impl) {
     System.out.println(
         "Activator called " + ++_count + " times");
     byte[ ] ref_data = ((ActivationImplDef) impl) .id();
     DBObjectImpl obj =
                  new DBObjectImpl(new String(ref_data));
     _boa.obj_is_ready(obj);
     return obj;
  }
  public void deactivate(org.omg.CORBA.Object obj,
     com.inprise.vbroker.extension.ImplementationDef impl) {
   // nothing to do here...
  }
}
. . .