10.5.2 QoSインタフェース
QoSポリシーの取得と設定には,次のインタフェースを使用します。
- 〈この項の構成〉
-
-
(2) CORBA::Objectまたはcom.inprise.vbroker.CORBA.Object(Borland)
-
(5) QoSExt::DeferBindPolicyまたはcom.inprise.vbroker.QoSExt.DeferBindPolicy
-
(6) QoSExt::ExclusiveConnectionPolicyまたはcom.inprise.vbroker.QoSExt.ExclusiveConnectionPolicy
-
(8) Messaging::RebindPolicyまたはorg.omg.Messaging.RebindPolicy
-
(9) Messaging::RelativeRequestTimeoutPolicyまたはorg.omg.CORBA.Messaging.RelativeRequestTimeoutPolicy
-
(11) Messaging::SyncScopePolicyまたはorg.omg.CORBA.Messaging.SyncScopePolicy
(1) CORBA::Objectまたはorg.omg.CORBA.Object
CORBA::Object(C++)およびorg.omg.CORBA.Object(Java)に含まれる次のメソッドは,有効ポリシーの取得やポリシーの変更の取得または設定に使用します。
-
_get_policyは,オブジェクトリファレンスの有効ポリシーを返します。
-
_set_policy_overrideは,オブジェクトレベルの,リクエストされたポリシーの変更のリストで新しいオブジェクトリファレンスを返します。
(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++の場合
-
次のメソッドは,メソッド名の先頭の"_"がない名称で提供されています。
-
_get_client_policyは,サーバ側ポリシーとの共通部分以外のオブジェクトリファレンスの有効Policyを返します。有効な変更は,指定された変更をオブジェクトレベル,スレッドレベル,VisiBroker ORBレベルの順でチェックすることで取得されます。リクエストされたPolicyTypeの変更を指定していない場合,PolicyTypeのシステムデフォルト値が使用されます。
-
_get_policy_overridesは,オブジェクトレベルで設定された指定ポリシータイプのPolicyを変更するリストを返します。指定されたシーケンスが空の場合,オブジェクトレベルのすべての変更が返されます。オブジェクトレベルで変更されたPolicyTypeがなければ,空シーケンスが返されます。
-
_validate_connectionは,オブジェクトに対して現在有効なポリシーが呼び出しを許可するかどうかに基づいて,boolean値を返します。オブジェクトリファレンスがバインドされていなければ,バインディングが発生します。オブジェクトリファレンスがすでにバインドされているが,現在のポリシーの変更作業が変更された場合,またはバインディングがもう有効でない場合は,RebindPolicyの変更の設定には関係なくリバインドが試みられます。現在の有効ポリシーがINV_POLICY例外を発生させる場合は,リターン値はfalseです。現在の有効ポリシーに不具合があれば,不具合なポリシーを記載したPolicyListタイプのシーケンスが返されます。
(3) CORBA::PolicyManagerまたはorg.omg.CORBA.PolicyManager
PolicyManagerは,VisiBroker ORBレベルのPolicyの変更の取得と設定を行うメソッドを提供するインタフェースです。
-
get_policy_overridesは,リクエストされたPolicyTypesの変更されたすべてのポリシーのPolicyListシーケンスを返します。指定されたシーケンスが空の場合,カレントコンテキストレベルのすべてについてPolicyの変更が返されます。リクエストされたPolicyTypesが一つもターゲットのPolicyManagerで変更されていなければ,空のシーケンスが返されます。
-
set_policy_overridesは,リクエストされたPolicyの変更のリストでカレントの変更作業を変更します。第1入力パラメタのpoliciesは,Policyオブジェクトのリファレンスのシーケンスです。SetOverrideType型(C++)またはorg.omg.CORBA.SetOverrideType型(Java)の第2パラメタであるset_addは,ADD_OVERRIDEを使用してこれらのポリシーをPolicyManagerにすでに存在するほかの変更に追加するか,またはSET_OVERRIDESを使用して,変更を含まないPolicyManagerにこれらのポリシーを追加するかを示します。ポリシーの空シーケンスとSET_OVERRIDESモードを指定してset_policy_overridesを呼び出すと,すべての変更をPolicyManagerから削除します。クライアントに適用できないポリシーを変更しようとすると,NO_PERMISSION例外(C++)またはorg.omg.CORBA.NO_PERMISSION例外(Java)が発生します。指定されたPolicyManagerが,リクエストが原因で不一致な状態になった場合には,ポリシーの変更や追加は行われないで,InvalidPolicies例外が発生します。
(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には,コネクション切断,オブジェクト転送リクエスト,オブジェクト障害などの場合に動作を決定する六つの値のうち一つを指定できます。現在サポートされている値は,次のとおりです。
-
Messaging::TRANSPARENT(C++)またはorg.omg.Messaging.TRANSPARENT(Java)は,リモートリクエスト時に,VisiBroker ORBがオブジェクト転送および必要なリコネクションを透過的に処理します。コードサンプル10-20では,TRANSPARENT型のRebindPolicy(Java)を作成して,VisiBroker ORBでそのポリシー,スレッド,およびオブジェクトレベルを設定します。
-
Messaging::NO_REBIND(C++)またはorg.omg.Messaging.NO_REBIND(Java)は,リモートリクエスト時に,クローズしたコネクションの再オープンをVisiBroker ORBが透過的に処理できるようにしますが,クライアントが想定している有効QoSポリシーの変更の原因となる透過的なオブジェクト転送はしません。RebindModeをNO_REBINDに設定すると,明示的なリバインドだけが許可されます。
-
Messaging::NO_RECONNECT(C++)またはorg.omg.Messaging.NO_RECONNECT(Java)は,VisiBroker ORBがオブジェクト転送やクローズしたコネクションの再オープンを透過的に処理しないようにします。RebindModeをNO_RECONNECTに設定した場合は,明示的にリバインドとリコネクトをする必要があります。
-
QoSExt::VB_TRANSPARENT(C++)またはcom.inprise.vbroker.QoSExt.VB_TRANSPARENTはデフォルトポリシーです。これは,明示的なバインディングと暗黙的なバインディングの双方による透過的バインディングを許可することで,TRANSPARENTの機能を継承します。VB_TRANSPARENTは,VisiBroker 3.xのオブジェクトフェールオーバーインプリメンテーションとの互換性を持つように設計されています。
-
QoSExt::VB_NOTIFY_REBIND(C++)またはcom.inprise.vbroker.QoSExt.VB_NOTIFY_REBIND(Java)は,リバインドが必要な場合に例外を発生させます。クライアントはこの例外をキャッチして,2回目の呼び出しでバインドします。
-
QoSExt::VB_NO_REBIND(C++)またはcom.inprise.vbroker.QoSExt.VB_NO_REBIND(Java)は,オブジェクト障害後osagentを使用してほかのオブジェクト呼び出しを有効にしません。これは,クライアントVisiBroker ORBが同じサーバへのクローズしたコネクションを再びオープンすることだけができるようになります。オブジェクトフォワーディングはできません。
- 注1
-
クライアントの有効ポリシーがVB_TRANSPARENTで,かつクライアントが状態データを保持しているサーバとともに動作中の場合,VB_TRANSPARENTは,クライアントにサーバの変更を気づかせることなくクライアントを新しいサーバに接続できます。元のサーバが保持していた状態データは失われます。
- 注2(C++の場合)
-
NO_REBINDまたはNO_RECONNECTの場合,CORBA::Objectクラスの_validate_connectionを呼び出すことによって,クローズしたコネクションの再オープンや転送が明示的に許可されることがあります。
表10-5に,異なるRebindMode型の動作を示します。
- コードサンプル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に渡されます。このポリシーは,クライアント側の変更だけ適用できます。