QoSポリシーの取得と設定には,次のインタフェースを使用します。
CORBA::Object(C++)およびorg.omg.CORBA.Object(Java)に含まれる次のメソッドは,有効ポリシーの取得やポリシーの変更の取得または設定に使用します。
PolicyManagerは,VisiBroker ORBレベルのPolicyの変更の取得と設定を行うメソッドを提供するインタフェースです。
PolicyCurrentインタフェースは,新たなメソッドを追加しないでPolicyManagerから派生します。このインタフェースは,スレッドレベルで変更されたポリシーへのアクセスを提供します。resolve_initial_references(C++)またはorg.omg.CORBA.ORB.resolve_initial_references(Java)で"PolicyCurrent"という識別子を指定して実行することでスレッドのPolicyCurrentのリファレンスを取得できます。
DeferBindPolicyは,リモートオブジェクトが最初に作成された時にVisiBroker ORBがそのオブジェクトとのコンタクトを試みるか,最初の呼び出しが行われるまでこのコンタクトを遅延させるかを決定します。DeferBindPolicyの値はtrueとfalseです。DeferBindPolicyをtrueに設定すると,バインディングインスタンスの最初の呼び出しまですべてのバインドが遅延されます。デフォルト値はfalseです。
クライアントオブジェクトを生成し,DeferBindPolicyをtrueに設定すると,最初の呼び出しまでサーバ起動を延期できます。以前このオプションは,生成されたヘルパークラスのバインドメソッドのオプションとして提供されていました。
コードサンプル10-17は,DeferBindPolicy(C++)を作成して,VisiBroker ORB上にそのポリシーを設定する例を示します。コードサンプル10-18は,DeferBindPolicy(Java)を作成して,VisiBroker ORB上にそのポリシー,スレッド,およびオブジェクトレベルを設定するサンプルを示します。
//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);
//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);
ExclusiveConnectionPolicyはBorland Enterprise Server VisiBroker固有のポリシーであり,指定のサーバオブジェクトへの排他(非共用)コネクションを設定できます。このポリシーにboolean値(trueまたはfalse)を割り当てます。ポリシーがfalseの場合,既存のコネクションが存在すれば,既存のコネクションを使用(共用)します。既存のコネクションが存在しない場合は,新しいコネクションを作成します。デフォルト値はfalseです。
このポリシーはVisiBroker 3.xのObject._clone()と同じ機能を提供します。
examples/vbe/QoS_policies/qos/CloneClient.javaサンプルで,排他および非排他コネクションの設定方法の例を示します。
RelativeConnectionTimeoutPolicyは,使用できる終端のどれかを使用してオブジェクトへの接続をリトライする場合のタイムアウトを指定します。タイムアウトの状態は,ファイアウォール(オブジェクトに接続する唯一の方法がHTTPトンネルである)で保護されたオブジェクトで発生しやすくなります。
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);
RebindPolicyは,リバインディング時にクライアントの動作を定義するためにMessaging::RebindMode型の値(C++)またはorg.omg.Messaging.RebindMode型の値(Java)を読み込みます。RebindPolicyはクライアント側だけに設定されます。RebindPolicyには,コネクション切断,オブジェクト転送リクエスト,オブジェクト障害などの場合に動作を決定する六つの値のうち一つを指定できます。現在サポートされている値は,次のとおりです。
表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例外が発生します。
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仕様のメッセージングについての記述を参照してください。
RelativeRequestTimeoutPolicyは,Requestまたはその応答Replyが渡される相対的な時間を示します。この時間が過ぎると,Requestはキャンセルされます。このポリシーは同期および非同期の両方の呼び出しに適用されます。リクエストは指定のタイムアウト時間内に完了するものと仮定するので,Replyがタイムアウトによって破棄されることはありません。タイムアウト値は100ナノ秒単位で指定されます。
//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);
RelativeRoundtripTimeoutPolicyは,Requestまたはその該当するReplyが渡される相対的な時間を指定します。このタイムアウトが過ぎても応答が渡されなかった場合,Requestはキャンセルされます。また,Requestがすでに渡されており,Replyがターゲットから返されると,Replyはこの時間が過ぎたら破棄されます。このポリシーは同期および非同期の両方の呼び出しに適用されます。タイムアウト値は100ナノ秒単位で指定します。
//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);
SyncScopePolicyは,ターゲットに関するリクエストの同期レベルを定義します。SyncScope型の値は,一方向オペレーションの動作を制御するために,SyncScopePolicyとともに使用されます。
SyncScopePolicyのデフォルトは,SYNC_WITH_TRANSPORTです。