10.5.2 QoSインタフェース

QoSポリシーの取得と設定には,次のインタフェースを使用します。

<この項の構成>
(1) CORBA::Objectまたはorg.omg.CORBA.Object
(2) CORBA::Objectまたはcom.inprise.vbroker.CORBA.Object(Borland)
(3) CORBA::PolicyManagerまたはorg.omg.CORBA.PolicyManager
(4) CORBA::PolicyCurrentまたはorg.omg.CORBA.PolicyCurrent
(5) QoSExt::DeferBindPolicyまたはcom.inprise.vbroker.QoSExt.DeferBindPolicy
(6) QoSExt::ExclusiveConnectionPolicyまたはcom.inprise.vbroker.QoSExt.ExclusiveConnectionPolicy
(7) QoSExt::RelativeConnectionTimeoutPolicyまたはcom.inprise.vbroker.QoSExt.RelativeConnectionTimeoutPolicy
(8) Messaging::RebindPolicyまたはorg.omg.Messaging.RebindPolicy
(9) Messaging::RelativeRequestTimeoutPolicyまたはorg.omg.CORBA.Messaging.RelativeRequestTimeoutPolicy
(10) Messaging::RelativeRoundTripTimeoutPolicyまたはorg.omg.CORBA.Messaging.RelativeRoundtripTimeoutPolicy
(11) Messaging::SyncScopePolicyまたはorg.omg.CORBA.Messaging.SyncScopePolicy

(1) CORBA::Objectまたはorg.omg.CORBA.Object

CORBA::Object(C++)およびorg.omg.CORBA.Object(Java)に含まれる次のメソッドは,有効ポリシーの取得やポリシーの変更の取得または設定に使用します。

(2) CORBA::Objectまたはcom.inprise.vbroker.CORBA.Object(Borland)

Javaの場合
このインタフェースを使用するには,org.omg.CORBA.Objectをcom.inprise.vbroker.CORBA.Objectにキャストする必要があります。このインタフェースはorg.omg.CORBA.Objectから派生するので,org.omg.CORBA.Objectで定義されたメソッドに加えて次のメソッドが使用できます。
C++の場合
次のメソッドは,メソッド名の先頭の"_"がない名称で提供されています。

(3) CORBA::PolicyManagerまたはorg.omg.CORBA.PolicyManager

PolicyManagerは,VisiBroker ORBレベルのPolicyの変更の取得と設定を行うメソッドを提供するインタフェースです。

(4) CORBA::PolicyCurrentまたはorg.omg.CORBA.PolicyCurrent

PolicyCurrentインタフェースは,新たなメソッドを追加しないでPolicyManagerから派生します。このインタフェースは,スレッドレベルで変更されたポリシーへのアクセスを提供します。resolve_initial_references(C++)またはorg.omg.CORBA.ORB.resolve_initial_references(Java)で"PolicyCurrent"という識別子を指定して実行することでスレッドのPolicyCurrentのリファレンスを取得できます。

(5) QoSExt::DeferBindPolicyまたはcom.inprise.vbroker.QoSExt.DeferBindPolicy

DeferBindPolicyは,リモートオブジェクトが最初に作成された時にVisiBroker ORBがそのオブジェクトとのコンタクトを試みるか,最初の呼び出しが行われるまでこのコンタクトを遅延させるかを決定します。DeferBindPolicyの値はtrueとfalseです。DeferBindPolicyをtrueに設定すると,バインディングインスタンスの最初の呼び出しまですべてのバインドが遅延されます。デフォルト値はfalseです。

クライアントオブジェクトを生成し,DeferBindPolicyをtrueに設定すると,最初の呼び出しまでサーバ起動を延期できます。以前このオプションは,生成されたヘルパークラスのバインドメソッドのオプションとして提供されていました。

コードサンプル10-17は,DeferBindPolicy(C++)を作成して,VisiBroker ORB上にそのポリシーを設定する例を示します。コードサンプル10-18は,DeferBindPolicy(Java)を作成して,VisiBroker ORB上にそのポリシー,スレッド,およびオブジェクトレベルを設定するサンプルを示します。

コードサンプル10-17 DeferBindPolicyの作成(C++)

//Initialize the flag and references
CORBA::Boolean deferMode = (CORBA::Boolean)1;
CORBA::Any policy_value;
policy_value << = CORBA::Any::from_boolean(deferMode);

CORBA::Policy_var policy =
   orb->create_policy(QoSExt::DEFER_BIND_POLICY_TYPE,policy_value);

CORBA::PolicyList policies;
policies.length(1);
policies [0] = CORBA::Policy::_duplicate(policy);

//Get a reference to the thread manager
CORBA::Object_var obj =
  orb->resolve_initial_references("ORBPolicyManager");
CORBA::PolicyManager_var orb_mgr =
  CORBA::PolicyManager::_narrow(obj);

//Set the policy on the ORB level
orb_mgr->set_policy_overrides(policies,CORBA::SET_OVERRIDE);

コードサンプル10-18 DeferBindPolicyの作成(Java)
次のサンプルではDeferBindPolicyを作成して,VisiBroker ORB上にそのポリシー,スレッド,およびオブジェクトレベルを設定します。

//Initialize the flag and the references
boolean deferMode = true;
Any policyValue = orb.create_any();
policyValue.insert_boolean(deferMode);

Policy policies =
orb.create_policy(DEFER_BIND_POLICY_TYPE.value,policyValue);

//Get a reference to the thread manager
  PolicyManager orbManager =
    PolicyManagerHelper.narrow(
      orb.resolve_initial_references("ORBPolicyManager"));

//Set the policy on the ORB level
orbManager.set_policy_overrides(new Policy[ ] {policies},
SetOverrideType.SET_OVERRIDE);

//Get the binding method
 byte[ ] managerId =="BankManager".getBytes();
 Bank.AccountManager manager =
   Bank.AccountManagerHelper.bind(orb,"/qos_poa",managerId);

(6) QoSExt::ExclusiveConnectionPolicyまたはcom.inprise.vbroker.QoSExt.ExclusiveConnectionPolicy

ExclusiveConnectionPolicyはBorland Enterprise Server VisiBroker固有のポリシーであり,指定のサーバオブジェクトへの排他(非共用)コネクションを設定できます。このポリシーにboolean値(trueまたはfalse)を割り当てます。ポリシーがfalseの場合,既存のコネクションが存在すれば,既存のコネクションを使用(共用)します。既存のコネクションが存在しない場合は,新しいコネクションを作成します。デフォルト値はfalseです。

このポリシーはVisiBroker 3.xのObject._clone()と同じ機能を提供します。

examples/vbe/QoS_policies/qos/CloneClient.javaサンプルで,排他および非排他コネクションの設定方法の例を示します。

(7) QoSExt::RelativeConnectionTimeoutPolicyまたはcom.inprise.vbroker.QoSExt.RelativeConnectionTimeoutPolicy

RelativeConnectionTimeoutPolicyは,使用できる終端のどれかを使用してオブジェクトへの接続をリトライする場合のタイムアウトを指定します。タイムアウトの状態は,ファイアウォール(オブジェクトに接続する唯一の方法がHTTPトンネルである)で保護されたオブジェクトで発生しやすくなります。

コードサンプル10-19 RelativeConnectionTimeoutPolicyの作成(Java)
次のコードはRelativeConnectionTimeoutPolicyの作成方法を示します。

  Any connTimeoutPolicyValue =orb.create_any();

  // Input is in 100s of Nanoseconds.
  // To specify a value of 20 seconds,
  // use 20 *10 ^7 nanoseconds as input

  int connTimeout =20;

  connTimeoutPolicyValue.insert_ulonglong(connTimeout *10000000);
  org.omg.CORBA.Policy ctoPolicy =
        orb.create_policy(RELATIVE_CONN_TIMEOUT_POLICY_TYPE.value,
              connTimeoutPolicyValue);
  PolicyManager orbManager =PolicyManagerHelper.narrow (
              orb.resolve_initial_references("ORBPolicyManager"));

  orbManager.set_policy_overrides(new Policy[ ] ¥{ctoPolicy ¥},
         SetOverrideType.SET_OVERRIDE);

(8) Messaging::RebindPolicyまたはorg.omg.Messaging.RebindPolicy

RebindPolicyは,リバインディング時にクライアントの動作を定義するためにMessaging::RebindMode型の値(C++)またはorg.omg.Messaging.RebindMode型の値(Java)を読み込みます。RebindPolicyはクライアント側だけに設定されます。RebindPolicyには,コネクション切断,オブジェクト転送リクエスト,オブジェクト障害などの場合に動作を決定する六つの値のうち一つを指定できます。現在サポートされている値は,次のとおりです。

注1
クライアントの有効ポリシーがVB_TRANSPARENTで,かつクライアントが状態データを保持しているサーバとともに動作中の場合,VB_TRANSPARENTは,クライアントにサーバの変更を気づかせることなくクライアントを新しいサーバに接続できます。元のサーバが保持していた状態データは失われます。
注2(C++の場合)
NO_REBINDまたはNO_RECONNECTの場合,CORBA::Objectクラスの_validate_connectionを呼び出すことによって,クローズしたコネクションの再オープンや転送が明示的に許可されることがあります。

表10-5に,異なるRebindMode型の動作を示します。

表10-5 RebindModeポリシー

RebindMode型同じオブジェクトへのクローズしたコネクションの再確立オブジェクト転送の可否オブジェクトフェールオーバーの可否
NO_RECONNECT行わないで,REBIND例外を発生させます。不可。REBIND例外を発生させます。不可。
NO_REBIND行います。ポリシーが一致すれば可。
それ以外は,不可。REBIND例外を発生させます。
不可。
TRANSPARENT行います。可。不可。
VB_NO_REBIND行います。不可。行わないで,例外を発生させます。不可。行わないで,例外を発生させます。
VB_NOTIFY_REBIND行います。可。可。障害検出後,VB_NOTIFY_REBINDは例外を発生させてから,以降のリクエストでosagentを使用してほかのオブジェクト呼び出しを試みます。
VB_TRANSPARENT行います。可。透過的に可。

注※ 通信障害またはオブジェクト障害でフェールオーバーできない場合は,適切なCORBA例外が発生します。


コードサンプル10-20 TRANSPARENT型のRebindPolicyの作成
次のサンプルでは,TRANSPARENT型のRebindPolicyを作成して,VisiBroker ORBでそのポリシー,スレッド,およびオブジェクトレベルを設定します。

Any policyValue=orb.create_any();
RebindModeHelper.insert(policyValue,
            org.omg.Messaging.TRANSPARENT.value);
Policy myRebindPolicy =orb.create_policy(
               REBIND_POLICY_TYPE.value,policyValue);

//get a reference to the ORB policy manager
org.omg.CORBA.PolicyManager manager;

try {
 manager =
     PolicyManagerHelper.narrow(orb.resolve_initial_references
                     ("ORBPolicyManager"));
}
catch(org.omg.CORBA.ORBPackage.InvalidName e){}

//get a reference to the per-thread manager
org.omg.CORBA.PolicyManager current;
try {
  current=PolicyManagerHelper.narrow(orb.resolve_initial_references
                     ("PolicyCurrent"));
}
catch(org.omg.CORBA.ORBPackage.InvalidName e){}

//set the policy on the orb level
try{
  manager.set_policy_overrides(myRebindPolicy,
                                 SetOverrideType.SET_OVERRIDE);
}
catch (InvalidPolicies e){}

//set the policy on the Thread level
try{
  current.set_policy_overrides(myRebindPolicy,
                                 SetOverrideType.SET_OVERRIDE);
}
catch (InvalidPolicies e){}

//set the policy on the object level:
org.omg.CORBA.Object oldObjectReference=bind(...);
org.omg.CORBA.Object newObjectReference=oldObjectReference._set_policy_override
        (myRebindPolicy,SetOverrideType.SET_OVERRIDE);

QoSポリシーと型の詳細については,マニュアル「Borland Enterprise Server VisiBroker プログラマーズリファレンス」の「QoSインタフェースとクラス」の記述,およびCORBA 2.5仕様のメッセージングについての記述を参照してください。

(9) Messaging::RelativeRequestTimeoutPolicyまたはorg.omg.CORBA.Messaging.RelativeRequestTimeoutPolicy

RelativeRequestTimeoutPolicyは,Requestまたはその応答Replyが渡される相対的な時間を示します。この時間が過ぎると,Requestはキャンセルされます。このポリシーは同期および非同期の両方の呼び出しに適用されます。リクエストは指定のタイムアウト時間内に完了するものと仮定するので,Replyがタイムアウトによって破棄されることはありません。タイムアウト値は100ナノ秒単位で指定されます。

コードサンプル10-21 RelativeRequestTimeoutPolicyの作成
次のサンプルでは,RelativeRequestTimeoutPolicyの作成方法を示します。

//Specify the timeout in 100s of Nanoseconds
//To set a timeout of 20 secs,set 20 *10 ^7 nanoseconds

int reqTimeout =20;
RelativeRequestTimeoutPolicyImpl relReq =
      new RelativeRequestTimeoutPolicyImpl(reqTimeout *10000000);
Any policyValue =orb.create_any();¥par
RelativeRequestTimeoutPolicyHelper.insert(policyValue,
                 (RelativeRequestTimeoutPolicy)relReq);

//set the RelativeRequestTimeoutPolicy
org.omg.CORBA.Policy reqPolicy =orb.create_policy(
       RELATIVE_REQ_TIMEOUT_POLICY_TYPE.value,policyValue);
PolicyManager orbManager =PolicyManagerHelper.narrow(
                 orb.resolve_initial_references("ORBPolicyManager"))
orbManager.set_policy_overrides(new Policy[ ]
             SetOverrideType.SET_OVERRIDE);

(10) Messaging::RelativeRoundTripTimeoutPolicyまたはorg.omg.CORBA.Messaging.RelativeRoundtripTimeoutPolicy

RelativeRoundtripTimeoutPolicyは,Requestまたはその該当するReplyが渡される相対的な時間を指定します。このタイムアウトが過ぎても応答が渡されなかった場合,Requestはキャンセルされます。また,Requestがすでに渡されており,Replyがターゲットから返されると,Replyはこの時間が過ぎたら破棄されます。このポリシーは同期および非同期の両方の呼び出しに適用されます。タイムアウト値は100ナノ秒単位で指定します。

コードサンプル10-22 RelativeRoundTripTimeoutPolicyの作成
次のサンプルでは,RelativeRoundTripTimeoutPolicyの作成方法を示します。

//Specify the timeout in 100s of Nanoseconds
//To set a timeout of 90 secs,set 90 *10 ^7 nanosecs

int rttTimeout =20;
RelativeRoundtripTimeoutPolicyImpl relRtt =new
       RelativeRoundtripTimeoutPolicyImpl(rttTimeout *10000000);
Any policyValue =orb.create_any();
         RelativeRoundtripTimeoutPolicyHelper.insert(policyValue,
                  (RelativeRoundtripTimeoutPolicy)relRtt);

//set the RelativeRoundtripTimeoutPolicy

org.omg.CORBA.Policy rttPolicy =orb.create_policy(
         RELATIVE_RT_TIMEOUT_POLICY_TYPE.value,policyValue);
PolicyManager orbManager =PolicyManagerHelper.narrow(
         orb.resolve_initial_references("ORBPolicyManager"));
orbManager.set_policy_overrides(new Policy[ ]
           SetOverrideType.SET_OVERRIDE);

(11) Messaging::SyncScopePolicyまたはorg.omg.CORBA.Messaging.SyncScopePolicy

SyncScopePolicyは,ターゲットに関するリクエストの同期レベルを定義します。SyncScope型の値は,一方向オペレーションの動作を制御するために,SyncScopePolicyとともに使用されます。

SyncScopePolicyのデフォルトは,SYNC_WITH_TRANSPORTです。

アプリケーションは,VisiBroker ORBインプリメンテーションのポータビリティを確保するために,明示的にVisiBroker ORBレベルのSyncScopePolicyを設定する必要があります。SyncScopePolicyのインスタンスが作成される場合,Messaging::SyncScope型の値はCORBA::ORB::create_policyに渡されます。このポリシーは,クライアント側の変更だけ適用できます。