CIM インジケーション、および CIM インジケーションを使用してイベントの発生を通知する方法については、http://www.dmtf.org/education/whitepapers.php の「CIM Schema White Papers」を参照してください。
「イベント」とは、1 つの発生した事象です。「インジケーション」とは、イベントの発生通知です。CIM では、発行されるのはインジケーションであり、イベントではありません。イベントの発生時に、プロバイダはインジケーションを生成します。
インジケーションは、状態の変化を認識する 0 以上の「トリガー」を保持します。WBEM は、トリガーを表す明示的なオブジェクトを保持しません。その代わり、トリガーは以下のアクションにより暗黙的に示されます。
システムの基本オブジェクトに対する操作。クラスの作成、削除、変更、クラスへのアクセスなどを実行できます。インスタンスの変更、インスタンスへのアクセスも可能です。
管理された環境内で発生するイベント
たとえば、サービスの終了によってトリガーが作動したとき、このイベントは、サービスが終了したことを通知するインジケーションになります。
Solaris WBEM サービススキーマ内の関連するCIM イベントクラスは、/usr/sadm/lib/wbem/doc/mofhtml/index.html で確認できます。次の表に、クラスの構造を示します。
表 4–5 CIM_Indication クラス構造
ルートクラス |
スーパークラス |
サブクラス |
---|---|---|
CIM_Indication |
CIM_ClassIndication |
CIM_ClassCreation, CIM_ClassDeletion, CIM_ClassModification |
CIM_InstIndication |
CIM_InstCreation、CIM_InstDeletion、CIM_InstMethodCall、CIM_InstModification、CIM_InstRead |
|
CIM_ProcessIndication |
CIM_AlertIndication, CIM_AlertInstIndication, CIM_ThresholdIndication, CIM_SNMPTrapIndication |
CIM イベントは、ライフサイクルまたはプロセスとして分類できます。「ライフサイクルイベント」は、データ内の特定の変更によって発生する組み込み型の CIM イベントです。ライフサイクルイベントをトリガーする変更には、次のものがあります。
クラスの作成、変更、または削除
クラスインスタンスの作成、変更、削除、読み取り、またはメソッド呼び出し
「プロセスイベント」は、ライフサイクルイベントに含まれないユーザー定義のイベントです。
イベントプロバイダは、CIMOM により作成された要求に応答してインジケーションを生成します。CIMOM は、予約要求を分析します。CIMOM は、EventProvider または CIMIndicationProvider インタフェースを使ってプロバイダと通信を行い、適切なインジケーションを生成するように要求します。プロバイダがインジケーションを生成すると、CIMOM は CIM_IndicationHandler インスタンスにより指定された宛先にインジケーションを配信します。これらのインスタンスは、予約者により作成されます。
イベントプロバイダは、インスタンスプロバイダと同じ方法で検出されます。CIM_InstIndication のサブクラスなど、インスタンスのライフサイクルインジケーションに属する予約の場合、CIMOM は、特定の手順に従います。CIMOM は、予約の有効範囲内のクラスを判別すると、これらのクラスのインスタンスプロバイダと通信します。プロセスインジケーションの場合、CIMOM は Provider 修飾子を使用して、適切なプロバイダと通信を行います。
CIM オブジェクトマネージャおよび CIM オブジェクトマネージャリポジトリは、次の条件下でインジケーションを処理します。
プロバイダがインジケーションをサポートしない場合、またはプロバイダによって CIMOM からのポーリングが禁じられている場合、CIMOM は次のイベントを処理します。
CIM_InstMethodCall
CIM_InstModification
CIM_InstDeletion
CIM_InstCreation
CIM オブジェクトマネージャリポジトリは、プロバイダを保持しないクラスインジケーションおよびライフサイクルインジケーションをすべて処理します。次のクラスがあります。
CIM_ClassCreation
CIM_ClassDeletion
CIM_ClassModification
CIM_InstCreation
CIM_InstModification
CIM_InstDeletion
CIM_InstRead
上記の場合、プロバイダはインジケーションを生成しないか、EventProvider インタフェースを実装します。また、プロバイダは、イベントの生成機能を CIM オブジェクトマネージャに委託することもできます。CIM オブジェクトマネージャ は、プロバイダ上の enumerateInstances を呼び出します。CIMOM は、以前の状態のスナップショットと現在の状態のスナップショットを比較して、インスタンスの作成、変更、または削除が行われたかどうかを特定します。
ポーリングを使用すると大幅なオーバーヘッドが発生するため、ほとんどの場合、プロバイダが独自のインジケーションを処理する必要があります。インジケーションを生成する場合は、プロバイダがポーリングを行う必要があります。このとき、プロバイダはタスクを CIMOM に委託できます。
プロバイダが EventProvider インタフェースを実装する場合、CIMOM はインタフェース内のメソッドを呼び出し、その応答に応じて操作を実行します。特定のプロバイダが予約要求に参加する必要があると CIMOM が判断すると、次の順序でメソッドが呼び出されます。
mustPoll – CIM オブジェクトマネージャ によるポーリングをプロバイダが望んでいるかどうかを判断するため、CIM オブジェクトマネージャ により、CIM_InstCreation、CIM_InstDeletion、および CIM_InstModification に対して呼び出されます。プロバイダが EventProvider インタフェースを実装していない場合、CIM オブジェクトマネージャ はデフォルトでポーリングを実行するとみなします。
authorizeFilter – プロバイダが Authorizable インタフェースを実装する場合、予約が承認されるかどうかを判断するため、CIMOM により、このメソッドが呼び出されます。プロバイダは、インジケーションハンドラの所有者 (インジケーションの受信者) のユーザー ID か、予約を作成したユーザーのユーザー ID に基づいて決定を行うことができます。
プロバイダが Authorizable インタフェースを実装しない場合、CIM オブジェクトマネージャは、名前空間に対してデフォルトの読み取り承認検査を実行します。
プロバイダが EventProvider インタフェースを実装せず、CIMOM がポーリングを試みる場合、プロバイダに対する enumerateInstances が正常終了すると、承認が正しく行われます。
activateFilter– 承認が正しく行われ、プロバイダがポーリングを要求しない場合に、CIMOM により呼び出されます。
deActivateFilter– 予約者または CIMOM によって予約が削除された場合に呼び出されます。たとえば、宛先ハンドラが正しく機能しない場合などです。
クライアントアプリケーションでは、CIM イベントが通知されるように予約することができます。「予約」は、1 つまたは複数の一連のインジケーションを宣言することによって行います。現在は、プロバイダがイベントインジケーションを予約することはできません。
CIM イベントのインジケーションを予約するアプリケーションは、次の情報を提供します。
アプリケーションが予約するインジケーション
CIMOM がインジケーションを送信するハンドラ
イベントの発生は、CIM_Indication クラスのいずれかのサブクラスのインスタンスとして表されます。インジケーションは、そのイベントがクライアントによって予約されているときだけ生成されます。
アプリケーションは、1 つまたは複数のイベントフィルタと 1 つまたは複数のイベントハンドラを作成できます。イベントインジケーションは、アプリケーションがイベントの予約を作成するまで送信されません。
CIM_Listener のインスタンスを作成します。詳細は、「CIM リスナーの追加」を参照してください。
CIM_IndicationFilter のインスタンスを作成します。詳細は、「イベント フィルタの作成」を参照してください。
CIM_IndicationHandler のインスタンスを作成します。詳細は、「イベントハ ンドラの作成」を参照してください。
CIM_IndicationFilter を CIM_IndicationHandler にバインドします。詳細は、「イベントフィルタとイベントハンドラのバインド」を参照してください。
CIM イベントのインジケーションを受信するには、最初に CIMClient に対して addCIMListener メソッドを呼び出して、CIMListener のインスタンスを CIMClient に追加します。
CIMListener インタフェースは、indicationOccured メソッドを実装する必要があります。このメソッドは、引数として CIMEvent を取ります。インジケーションが送信可能な場合、このメソッドが呼び出されます。
// CIM オブジェクトマネージャに接続する cc = new CIMClient(); // CIM リスナーを登録する cc.addCIMListener( new CIMListener() { public void indicationOccured(CIMEvent e) { } });
イベントフィルタでは、送信するイベントの種類と、どのような条件下で送信するかを指定します。CIM_IndicationFilter クラスのインスタンスを作成し、そのプロパティの値を定義することによって、イベントフィルタを作成します。各イベントフィルタは、そのフィルタが属する名前空間に属するイベントに対してのみ有効です。
CIM_IndicationFilter クラスは文字列型のプロパティを持ちます。これらのプロパティの設定により、フィルタを一意に識別したり、照会文字列を指定したり、照会文字列の構文解析を行う照会言語を指定したりできます。現在は、WQL (WBEM Query Language) だけがサポートされます。
表 4–6 CIM_IndicationFilter プロパティ
プロパティ |
説明 |
必須/任意 |
---|---|---|
SystemCreationClassName |
このフィルタを作成するクラスがあるシステム名、またはこのクラスが適用されるシステム名 |
任意。値は、CIM オブジェクトマネージャにより決定される |
SystemName |
このフィルタがあるシステム名、またはこのフィルタが適用されるシステム名 |
任意。このキープロパティのデフォルトは、CIM オブジェクトマネージャが動作しているシステム名 |
CreationClassName |
このフィルタの作成に使用するクラス名またはサブクラス名 |
任意。CIM オブジェクトマネージャは、このキープロパティのデフォルトとして CIM_IndicationFilter を割り当てる |
Name |
フィルタの固有名 |
任意。CIM オブジェクトマネージャは一意の名前を割り当てる |
SourceNamespace |
CIM インジケーション生成元であるローカル名前空間へのパス |
任意。デフォルトは null |
Query |
インジケーションをどのような条件のときに生成するかを定義する照会式。現在は、Level 1 の WQL 式だけがサポートされる。WQL 照会式の詳細は、第 5 章「WBEM 照会の作成」を参照 |
必須。 |
QueryLanguage |
照会を表現する言語 |
必須。デフォルトは WQL |
CIM_IndicationFilter クラスのインスタンスを作成します。
CIMClass cimfilter = cc.getClass (new CIMObjectPath "CIM_IndicationFilter"), true, true, true, null); CIMInstance ci = cimfilter.newInstance(); |
イベントフィルタ名を指定します。
Name = "filter_all_new_solarisdiskdrive" |
WQL 文字列を作成し、返されるイベントインジケーションを指定します。
String filterString = "SELECT * FROM CIM_InstCreation WHERE sourceInstance ISA Solaris_DiskDrive"; |
cimfilter インスタンス内にプロパティ値を設定して、次の情報を識別できるようにします。
フィルタ名
CIM イベントを選択するフィルタ文字列
照会文字列の構文解析を行う照会言語 (WQL)
ci.setProperty("Name", new CIMValue("filter_all_new_solarisdiskdrives")); ci.setProperty("Query", new CIMValue(filterString)); ci.setProperty("QueryLanguage", new CIMValue("WQL");)
cimfilter インスタンス (filter) を作成します。このインスタンスを CIM オブジェクトマネージャリポジトリに格納します。
CIMObjectPath filter = cc.createInstance(new CIMObjectPath(), ci); |
CIMClass cimfilter = cc.getClass(new CIMObjectPath ("CIM_IndicationFilter"), true); CIMInstance ci = cimfilter.newInstance(); // 名前空間に test_a クラスが存在するものとする String filterString = "select * from CIM_InstCreation where sourceInstance isa test_a" ci.setProperty("query", new CIMValue(filterString)); CIMObjectPath filter = cc.createInstance(newCIMObjectPath(), ci);
イベントハンドラは、CIM_IndicationHandler クラスのインスタンスです。CIM_IndicationHandler クラスのインスタンス内でプロパティを設定して、ハンドラに一意の名前を付け、その所有者の UID を示します。CIM イベント MOF には、HTTP プロトコルを使ってクライアントアプリケーションに送信されるインジケーションの宛先を指定する CIM_IndicationHandlerCIMXML クラスが定義されています。Solaris_Event.mof は、Solaris_JAVAXRMIDelivery クラスを作成することにより、CIM_IndicationHandler クラスを拡張します。 このサブクラスは、RMI プロトコルを使用するクライアントアプリケーションに、CIM イベントのインジケーションを送信します。RMI クライアントは、RMI 送信の場所を設定するために Solaris_JAVAXRMIDelivery クラスのインスタンスを作成する必要があります。
表 4–7 CIM_IndicationHandler プロパティ
プロパティ |
説明 |
必須/任意 |
---|---|---|
SystemCreationClassName |
このハンドラを作成するクラスがあるシステム名、またはこのクラスが適用されるシステム名 |
任意。CIM オブジェクトマネージャにより指定される |
SystemName |
このハンドラがあるシステム名、またはこのハンドラが適用されるシステム名 |
任意。このキープロパティのデフォルト値は、CIM オブジェクトマネージャが動作しているシステム名 |
CreationClassName |
このハンドラの作成に使用するクラスまたはサブクラス |
任意。CIM オブジェクトマネージャは、適切なクラス名をこのキープロパティのデフォルトとして割り当てる |
Name |
このハンドラの固有名 |
任意。クライアントアプリケーションは固有名を指定する必要がある |
Owner |
このハンドラを作成した、または保持するエンティティ名。プロバイダは、この値を検査して、インジケーションの受信をハンドラに承認するかどうかを判断できる |
任意。デフォルトは、このインスタンスを作成するユーザーの Solaris ユーザー名 |
// Solaris_JAVAXRMIDelivery クラスのインスタンスを作成するか、 // ハンドラの適切なインスタンスを取得する CIMInstance ci = cc.getIndicationHandler(null); // 新しいインスタンス (delivery) を // rmidelivery インスタンスから作成する CIMObjectPath delivery = cc.createInstance(new CIMObjectPath(), ci);
CIM_IndicationSubscription クラスのインスタンスを作成することにより、イベントフィルタとイベントハンドラをバインドします。このクラスのインジケーションを作成すると、イベントフィルタにより指定されたイベントのインジケーションが送信されます。
次の例では、予約 (filterdelivery) を作成し、 filter プロパティの値として 「イベントフィルタの作成」で作成した filter オブジェクトパスを指定します。また、handler プロパティの値として、例 4–23 で作成した delivery オブジェクトパスを指定します。
CIMClass filterdelivery = cc.getClass(new CIMObjectPath("CIM_IndicationSubscription"), true, true, true, null); ci = filterdelivery.newInstance(): // filter インスタンスを参照する filter プロパティを作成 ci.setProperty("filter", new CIMValue(filter)); // delivery インスタンスを参照する handler プロパティを作成 ci.setProperty("handler", new CIMValue(delivery)); CIMObjectPath indsub = cc.createInstance(new CIMObjectPath(), ci);