Hitachi

VisiBroker Version 5 Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド


21.3.2 アンタイプドオブジェクトラッパーのインプリメント

〈この項の構成〉

(1) C++の場合

コードサンプル21-3に,TimeWrap.hファイルに定義されたTimingUntypedObjectWrapperのインプリメンテーションを示します。アンタイプドオブジェクトラッパーはVISObjectWrapper::UntypedObjectWrapperクラスから派生していなければなりません。ユーザはアンタイプドオブジェクトラッパー中のpre_methodとpost_methodの両メソッドのインプリメンテーションを提供できます。

ファクトリがインストールされたら,ファクトリのコンストラクタによって自動的にまたはVISObjectWrapper::ChainUntypedObjectWrapperFactory::createメソッドの起動によって手動で,クライアントがオブジェクトにバインドする際,またはサーバがオブジェクトインプリメンテーションでメソッドを起動する際に,アンタイプドオブジェクトラッパーオブジェクトが自動的に生成されます。

コードサンプル21-3に示すpre_methodは,TimeWrap.Cで定義されたTimerBeginメソッドを起動します。このメソッドは,現在の時間を取得するためにClosureオブジェクトを使用します。同様に,post_methodはTimerDeltaメソッドを起動し,pre_methodが呼び出されてからどれくらい時間がたったかを調べ,経過時間を出力します。

コードサンプル21-3 TimingUntypedObjectWrapperインプリメンテーション(C++)
class TimingObjectWrapper : public VISObjectWrapper::
      UntypedObjectWrapper {
   public:
      TimingObjectWrapper(
            const char* key=NULL) : _key(key) {}
 
      void pre_method(const char* operation,
            CORBA::Object_ptr target,
            VISClosure& closure) {
         cout << "*Timing: [" << flush;
         if ((char *)_key)
            cout << _key << flush;
         else
            cout << "<no key>" << flush;
         cout << "] pre_method\t" << operation << "\t->" 
            << endl;
         TimerBegin(closure, operation);
      }
 
      void post_method(const char* operation,
            CORBA::Object_ptr target,
            CORBA::Environment& env,
            VISClosure& closure) {
         cout << "*Timing: [" << flush;
         if ((char *)_key)
            cout << _key << flush;
         else
            cout << "<no key>" << flush;
         cout << "] post_method\t" ;
         TimerDelta(closure, operation);
      }
   private:
      CORBA::String_var _key;
};

(2) Javaの場合

コードサンプル21-4に,TimingUntypedObjectWrapperのインプリメンテーションを示します。アンタイプドオブジェクトラッパーはUntypedObjectWrapperクラスから派生していなければなりません。ユーザはアンタイプドオブジェクトラッパー中のpre_methodとpost_methodの両メソッドのインプリメンテーションを提供できます。

ファクトリがインストールされたら,ファクトリのコンストラクタによって自動的にまたはChainUntypedObjectWrapperFactory::addメソッドの起動によって手動で,クライアントがオブジェクトにバインドする際,またはサーバがオブジェクトインプリメンテーションでメソッドを起動する際に,アンタイプドオブジェクトラッパーオブジェクトが自動的に生成されます。

コードサンプル21-4に示すpre_methodは,現在の時間を取得し,それをプライベート変数に保存し,メッセージを出力します。同様に,post_methodも現在の時間を取得し,pre_methodが呼び出されてからどれくらい時間がたったかを調べ,経過時間を出力します。

コードサンプル21-4 TimingUntypedObjectWrapperインプリメンテーション(Java)
package UtilityObjectWrappers;
import com.inprise.vbroker.interceptor.*;
 
public class TimingUntypedObjectWrapper implements
                                     UntypedObjectWrapper {
   private long time;
   public void pre_method(String operation,
         org.omg.CORBA.Object target,
         Closure closure) {
      System.out.println("Timing: " +
               ((com.inprise.vbroker.CORBA.Object) target).
               _object_name() + "->" + operation + "()");
      time = System.currentTimeMillis();
   }
   public void post_method(String operation,
         org.omg.CORBA.Object target,
         org.omg.CORBA.Environment env,
         Closure closure) {
      long diff = System.currentTimeMillis() - time;
      System.out.println("Timing: Time for call \t" +
         ((com.inprise.vbroker.CORBA.Object)target).
          _object_name() + "->" + operation + "() = " +
          diff + " ms.");
   }
}

(3) pre_methodおよびpost_methodパラメタ

pre_methodとpost_methodは表21-2のパラメタを受け取ります。

表21‒2 pre_methodおよびpost_methodメソッドの共通引数

パラメタ

説明

operation

目的のオブジェクトでリクエストしたオペレーションの名前

target

目的のオブジェクト

closure

このオブジェクトラッパーのメソッド呼び出し用にデータを保存する領域

post_methodはEnvironmentパラメタも受け取ります。Environmentパラメタは,メソッド呼び出しの前の手順で起こる可能性のある例外をユーザに通知する際に使えます。