13.2.2 トリガーとは何か
トリガーとは本来,指定されたインスタンスの使用の可否をユーザに判定させるコールバック機能です。トリガーはAgentのポーリングの非同期な代替手段で,通常はオブジェクトとのコネクションが絶たれたあとの回復に使用されます。問い合わせはさまざまな方法で行われますが,トリガーは特殊な用途です。
- 〈この項の構成〉
-
(1) トリガーメソッドの考察
Agentクラスのトリガーメソッドについて表13-5および表13-6に示します。
表13‒5 トリガーメソッド(C++)
|
メソッド
|
説明
|
|
void reg_trigger (const TriggerDesc& _desc,
TriggerHandler_ptr _handler);
|
このメソッドはトリガーハンドラを登録するために使用します。
|
|
void unreg_trigger (const TriggerDesc& _desc,
TriggerHandler_ptr _handler)
|
このメソッドはトリガーハンドラの登録を解除するために使用します。
|
表13‒6 トリガーメソッド(Java)
|
メソッド
|
説明
|
|
void reg_trigger (
com.inprise.vbroker.ObjLocation.TriggerDesc desc,com.inprise.vbroker.ObjLocation.TriggerHandler handler)
|
このメソッドはトリガーハンドラを登録するために使用します。
|
|
void unreg_trigger (
com.inprise.vbroker.ObjLocation.TriggerDesc desc,com.inprise.vbroker.ObjLocation.TriggerHandler handler)
|
このメソッドはトリガーハンドラの登録を解除するために使用します。
|
どちらのAgentトリガーメソッドも,失敗の理由を示すFail例外を発生させることができます。
TriggerHandlerインタフェースは,表13-7および表13-8で説明するメソッドで構成されます。
表13‒7 TriggerHandlerインタフェースメソッド(C++)
|
メソッド
|
説明
|
|
void impl_is_ready(const Desc& _desc);
|
このメソッドは,descに一致するインスタンスがアクセス可能になると,ロケーションサービスによって呼び出されます。
|
|
void impl_is_down(const Desc& _desc )
|
このメソッドは,インスタンスが使用不能になると,ロケーションサービスによって呼び出されます。
|
表13‒8 TriggerHandlerインタフェースメソッド(Java)
|
メソッド
|
説明
|
|
void impl_is_ready (
com.inprise.vbroker.ObjLocation.TriggerDesc desc)
|
このメソッドは,descに一致するインスタンスがアクセス可能になると,ロケーションサービスによって呼び出されます。
|
|
void impl_is_down (
com.inprise.vbroker.ObjLocation.TriggerDesc desc)
|
このメソッドは,インスタンスが使用不能になると,ロケーションサービスによって呼び出されます。
|
ページの先頭へ
(2) トリガーの生成
TriggerHandlerはコールバックオブジェクトです。TriggerHandlerをインプリメントするには,TriggerHandlerPOAクラスから派生させ,そのimpl_is_ready()メソッドとimpl_is_down()メソッドをインプリメントします。ロケーションサービスにトリガーを登録するには,Agentインタフェースのreg_trigger()メソッドを使用します。このメソッドには,監視したいインスタンスを記述し,インスタンスの可用性が変化した場合に呼び出したいTriggerHandlerオブジェクトを指定する必要があります。インスタンス記述(TriggerDesc)には,リポジトリID,インスタンス名,ホスト名などのインスタンス情報の組み合わせを入れることができます。提供するインスタンス情報が詳細であればあるほど,インスタンスの仕様も特定化できます。
- IDLサンプル13-2 TriggerDescのIDL
struct TriggerDesc {
string repository_id;
string instance_name;
string host_name;
};
- 注
-
TriggerDescのフィールドに空の文字列("")を設定すると,このフィールドは無視されます。各フィールドのデフォルト値は空の文字列です。
例えば,リポジトリIDしか持たないTriggerDescは,そのインタフェースのどのインスタンスにも一致します。図13-3の例に戻ると,IDL:Automobile/Car:1.0のどのインスタンスのトリガーも,Tom's Car on Athena,Tom's
Car on Zeus,Kerri's Carというインスタンスのうちの一つが使用可能または使用不能になるとして発生します。ただし,TriggerDescに「Tom's Car」というインスタンス名を追加すると,二つの「Tom's Car」というインスタンスのどちらかの可用性が変化する場合だけトリガーが発生するように指定を厳しくします。最後にAthenaというホスト名を追加すると,AthenaサーバのTom's
Carインスタンスが使用可能または使用不能になる場合に限りトリガーが発生するように,トリガーをさらに改善できます。
ページの先頭へ
(3) トリガーが検出した最初のインスタンスだけを確認
トリガーは何度も呼び出されるものです。TriggerHandlerは,トリガー記述に合致するオブジェクトがアクセス可能になるたびに呼び出されます。最初のインスタンスがアクセス可能になる場合だけを知りたいときがあるでしょう。この場合には,このようなインスタンスの存在が最初に見つかったあと,Agentのunreg_trigger()メソッドを呼び出してトリガーを登録解除します。
ページの先頭へ