Solaris WBEM SDK 開発ガイド

CIM イベントの処理


注 -

CIM インジケーション、および CIM インジケーションを使用してイベントの発生を通知する方法については、 http://www.dmtf.org/education/whitepapers.php の CIM Schema White Papers を参照してください。


「イベント」とは、1 つの発生した事象です。「インジケーション」とは、イベントの発生通知です。CIM (Common Information Model) では、発行されるのはインジケーションであり、イベントではありません。イベントの発生時に、プロバイダはインジケーションを生成します。

インジケーションは、状態の変化を認識する 0 以上の「トリガー」を保持します。WBEM は、トリガーを表す明示的なオブジェクトを保持しません。その代わり、トリガーは以下により暗黙的に示されます。


たとえば、サービスが終了してトリガーが機能すると、このイベントによりサービスの終了を通知するインジケーションが生成されます。


Solaris WBEM サービススキーマ内の関連する CIM イベントクラスは、/usr/sadm/lib/wbem/doc/mofhtml/index.html で確認できます。クラスは、次のように構築されます。

表 3-5 CIM_Indication クラス構造

ルートクラス 

スーパークラス 

サブクラス 

CIM_Indication

CIM_ClassIndication

CIM_ClassCreationCIM_ClassDeletion CIM_ClassModification

 

CIM_InstIndication

CIM_InstCreation CIM_InstDeletionCIM_InstMethodCall CIM_InstModificationCIM_InstRead

 

CIM_ProcessIndication

CIM_AlertIndicationCIM_AlertInstIndication CIM_ThresholdIndicationCIM_SNMPTrapIndication

インジケーションについて

CIM イベントは、ライフサイクルまたはプロセスとして分類できます。「ライフサイクルイベント」は、データの変更に対応して発生する組み込みの CIM イベントであり、その内部で、クラスの作成、変更、削除、クラスインスタンスの作成、変更削除、読み取り、またはメソッド呼び出しが行われます。「プロセスイベント」は、ライフサイクルイベントに含まれないユーザー定義のイベントです。

イベントプロバイダは、CIM Object Manager により作成された要求に応答してインジケーションを生成します。CIM Object Manager は予約要求を分析し、 EventProviderCIMIndicationProvider インタフェース、あるいはその両方を使用してプロバイダと通信し、適切なインジケーションの生成を要求します。プロバイダがインジケーションを生成すると、CIM Object Manager は CIM_IndicationHandler インスタンスにより指定された宛先にインジケーションを配信します。これらのインスタンスは、予約者により作成されます。

イベントプロバイダは、インスタンスプロバイダと同じ方法で検出されます。インスタンスのライフサイクルインジケーション (CIM_InstIndication のサブクラス) に属する予約の場合、CIM Object Manager が予約の有効範囲内のクラスを判別すると、これらのクラスのインスタンスプロバイダに対し通信を行います。プロセスインジケーションの場合、CIM Object Manager は Provider 修飾子を使用して、適切なプロバイダと通信を行います。

CIM Object Manager および CIM Object Manager Repository は、次の条件下でインジケーションを処理します。

上記の場合、プロバイダはインジケーションを生成しないか、EventProvider インタフェースを実装します。また、プロバイダは、イベントの生成機能を CIM Object Manager に委託することもできます。CIM Object Manager は、プロバイダに対して enumerateInstances を呼び出して、以前の状態のスナップショットを現在の状態と比較し、インスタンスが作成、変更、または削除されたかどうかを判断します。


注 -

ポーリングを使用すると大幅なオーバーヘッドが発生するため、ほとんどの場合、プロバイダが独自のインジケーションを処理する必要があります。インジケーションを生成する場合、プロバイダ自体がポーリングを行う必要があります。このとき、プロバイダはタスクを CIM Object Manager に委託できます。


プロバイダが EventProvider インタフェースを実装する場合、CIM Object Manager はインタフェース内のメソッドを呼び出し、その応答に応じて操作を実行します。特定のプロバイダが予約要求に参加する必要があると CIM Object Manager が判断すると、次の順序でメソッドが呼び出されます。

  1. mustPoll - CIM_InstCreationCIM_InstDeletion、および CIM_InstModification に対応して CIM Object Manager により呼び出され、CIM Object Manager によるポーリングをプロバイダが望んでいるかどうかを判断します。プロバイダが EventProvider インタフェースを実装していない場合、CIM Object Manager はデフォルトでポーリングを実行するとみなします。

  2. authorizeFilter - プロバイダが Authorizable インタフェースを実装する場合、CIM Object Manager によりこのメソッドが呼び出され、予約が承認されるかどうかを判断します。プロバイダは、インジケーションハンドラの所有者のユーザー ID (インジケーションを受信するユーザー)、または予約を作成したユーザーに基づいて、決定を行います。

    プロバイダが Authorizable インタフェースを実装しない場合、CIM Object Manager は、名前空間に対してデフォルトの読み取り承認検査を実行します。

    プロバイダが EventProvider インタフェースを実装せず、CIM Object Manager がポーリングを試みる場合、プロバイダに対する enumerateInstances が正常終了すると、承認が正しく行われます。

  3. activateFilter - 承認が正しく行われ、プロバイダがポーリングを要求しない場合に、CIM Object Manager により呼び出されます。

  4. deActivateFilter - 予約が予約者または CIM Object Manager により削除される場合 (宛先ハンドラが正常に機能しない場合など) に呼び出されます 。

予約について

クライアントアプリケーションでは、CIM イベントが通知されるように予約することができます。「予約」は、1 つまたは複数の一連のインジケーションを宣言することによって行います。現在は、プロバイダがイベントインジケーションを予約することはできません。

CIM イベントのインジケーションを予約するアプリケーションには、 次の指定を行います。

イベントの発生は、CIM_Indication クラスのいずれかのサブクラスのインスタンスとして表されます。インジケーションは、そのイベントがクライアントによって予約されているときだけ生成されます。

予約の作成

アプリケーションは、1 つまたは複数のイベントフィルタと 1 つまたは複数のイベントハンドラを作成できます。イベントインジケーションは、アプリケーションがイベントの予約を作成するまで送信されません。

  1. CIM_Listener のインスタンスを作成します。詳細は、「CIM リスナーの追加」を参照してください。

  2. CIM_IndicationFilter のインスタンスを作成します。詳細は、「イベントフィルタの作成」を参照してください。

  3. CIM_IndicationHandler のインスタンスを作成します。詳細は、「イベントハンドラの作成」を参照してください。

  4. CIM_IndicationFilter CIM_IndicationHandler にバインドします。詳細は、「イベントフィルタとイベントハンドラのバインド」を参照してください。

CIM リスナーの追加

CIM イベントのインジケーションを受信するには、最初に CIMClient に対して addCIMListener メソッドを呼び出して、CIMListener のインスタンスを CIMClient に追加します。


注 -

CIMListener インタフェースは、indicationOccured メソッドを実装する必要があります。このメソッドは、引数として CIMEvent を取ります。インジケーションが送信可能な場合、このメソッドが呼び出されます。



例 3-21 CIM リスナーの追加

// CIM Object Manager に接続する
cc = new CIMClient();

// CIM リスナーを登録する
cc.addCIMListener(
new CIMListener() {
    public void indicationOccured(CIMEvent e) {
    }
});


イベントフィルタの作成

イベントフィルタでは、送信するイベントの種類と、どのような条件下で送信するかを指定します。CIM_IndicationFilter クラスのインスタンスを作成し、そのプロパティの値を定義することによって、イベントフィルタを作成します。各イベントフィルタは、そのフィルタが属する名前空間に属するイベントに対してのみ有効です。

CIM_IndicationFilter クラスは、一意のフィルタ識別、照会文字列の指定、照会文字列を構文解析する照会言語の指定が可能な文字列プロパティを保持します。現在は、WQL (WBEM Query Language) だけがサポートされます。

表 3-6 CIM_IndicationFilter プロパティ

プロパティ 

説明 

必須/任意 

SystemCreationClassName

このフィルタを作成するクラスがあるシステム名、またはこのクラスが適用されるシステム名 

任意。値は、CIM Object Manager により決定される 

SystemName

このフィルタがあるシステム名、またはこのフィルタが適用されるシステム名 

任意。このキープロパティのデフォルトは、CIM Object Manager が動作しているシステム名 

CreationClassName

このフィルタの作成に使用するクラス名またはサブクラス名 

任意。CIM Object Manager は、このキープロパティのデフォルトとして CIM_IndicationFilter を割り当てる

Name

フィルタの固有名 

任意。CIM Object Manager は一意の名前を割り当てる 

SourceNamespace

CIM インジケーション生成元であるローカル名前空間へのパス 

任意。デフォルトは null 

Query

インジケーションをどのような条件のときに生成するかを定義する照会式。現在は、Level 1 の WQL 式だけがサポートされる。WQL 照会式の詳細は、第 5 章「WBEM 照会の作成」を参照

必須 

QueryLanguage

照会を表現する言語 

必須。デフォルトは WQL  

イベントフィルタの作成
  1. CIM_IndicationFilter クラスのインスタンスを作成します。

    CIMClass cimfilter = cc.getClass
            (new CIMObjectPath(“CIM_IndicationFilter”),
             true, true, true, null);
    CIMInstance ci = cimfilter.newInstance();

  2. イベントフィルタ名を指定します。

    Name = “filter_all_new_solarisdiskdrives”

  3. WQL 文字列を作成し、返されるイベントインジケーションを指定します。

    String filterString = “SELECT * 
            FROM CIM_InstCreation WHERE sourceInstance 
            ISA Solaris_DiskDrive”;

  4. cimfilter インスタンスの各プロパティ値に、フィルタ名、CIM イベントを選択するフィルタ文字列、照会文字列を解析する照会言語 (WQL) を設定します。

    ci.setProperty(“Name”, new 
            CIMValue("filter_all_new_solarisdiskdrives”));
    ci.setProperty("Query", new CIMValue(filterString));
    ci.setProperty("QueryLanguage", new CIMValue("WQL");)

  5. cimfilter インスタンスを filter という名前で作成し、CIM Object Manager Repository 内に格納します。

    CIMObjectPath filter = cc.createInstance(new
                                                   CIMObjectPath(), ci);


例 3-22 イベントフィルタの作成

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 イベント MOF は、Solaris_JAVAXRMIDelivery クラスを作成して CIM_IndicationHandler クラスを拡張し、RMI プロトコルを使用して CIM イベントインジケーションをクライアントアプリケーションへ送信します。RMI クライアントは、Solaris_JAVAXRMIDelivery クラスのインスタンスを作成して、RMI 送信の場所を設定する必要があります。

表 3-7 CIM_IndicationHandler プロパティ

プロパティ 

説明 

必須/任意 

SystemCreationClassName

このハンドラを作成するクラスがあるシステム名、またはこのクラスが適用されるシステム名 

 任意。CIM Object Manager により指定される

SystemName

このハンドラがあるシステム名、またはこのハンドラが適用されるシステム名。 

任意。このキープロパティのデフォルト値は、CIM Object Manager が動作しているシステム名。 

CreationClassName

このハンドラの作成に使用するクラスまたはサブクラス 

任意。CIM Object Manager は、適切なクラス名をこのキープロパティのデフォルトとして割り当てる 

Name

このハンドラの固有名 

任意。クライアントアプリケーションは固有名を指定する必要がある 

Owner

このハンドラを作成した、または保持するエンティティ名。プロバイダは、この値を検査して、インジケーションの受信をハンドラに承認するかどうかを判断できる 

任意。デフォルトは、このインスタンスを作成するユーザーの Solaris ユーザー名 


例 3-23 イベントハンドラの作成

// Solaris_JAVAXRMIDelivery クラスのインスタンスを作成するか、
// ハンドラの適切なインスタンスを取得する
CIMInstance ci = cc.getIndicationHandler(null);

// 新しいインスタンス (delivery) を
// rmidelivery インスタンスから作成する
CIMObjectPath delivery = cc.createInstance(new CIMObjectPath(), ci);


イベントフィルタとイベントハンドラのバインド

CIM_IndicationSubscription クラスのインスタンスを作成することにより、イベントフィルタとイベントハンドラをバインドします。このクラスのインジケーションを作成すると、イベントフィルタにより指定されたイベントのインジケーションが送信されます。

次の例では、予約 (filterdelivery) を作成し、“イベントフィルタの作成”で作成した filter オブジェクトパスに filter プロパティを定義します。また、例 3–23 で作成した delivery オブジェクトパスに handler プロパティを定義します。


例 3-24 イベントフィルタとイベントハンドラのバインド

CIMClass filterdelivery = cc.getClass(new 
        CIMObjectPath(“CIM_IndicationSubscription”), 
        true, true, true, null);
ci = filterdelivery.newInstance():

// フィルタインスタンスを参照する filter という名のプロパティを作成する
ci.setProperty("filter", new CIMValue(filter));

// 送信インスタンスを参照する handler という名のプロパティを作成する
ci.setProperty("handler", new CIMValue(delivery));

CIMObjectPath indsub = cc.createInstance(new CIMObjectPath(), ci);