Solaris WBEM 開発ガイド

CIM イベントの処理


注 –

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_InstCreationCIM_InstDeletionCIM_InstMethodCallCIM_InstModificationCIM_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 オブジェクトマネージャリポジトリは、次の条件下でインジケーションを処理します。

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


注 –

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


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

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

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

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

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

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

  4. deActivateFilter– 予約者または CIMOM によって予約が削除された場合に呼び出されます。たとえば、宛先ハンドラが正しく機能しない場合などです。

予約について

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

CIM イベントのインジケーションを予約するアプリケーションは、次の情報を提供します。

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

Procedure予約の作成

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

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

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

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

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

CIM リスナーの追加

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


注 –

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



例 4–21 CIM リスナーの追加

// 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 

Procedureイベントフィルタの作成

手順
  1. CIM_IndicationFilter クラスのインスタンスを作成します。

    CIMClass cimfilter = cc.getClass
            (new CIMObjectPath "CIM_IndicationFilter"),
             true, true, true, null);
    CIMInstance ci = cimfilter.newInstance();
  2. イベントフィルタ名を指定します。

    Name = "filter_all_new_solarisdiskdrive"
  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 オブジェクトマネージャリポジトリに格納します。

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

例 4–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_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 ユーザー名 


例 4–23 イベントハンドラの作成

//  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 オブジェクトパスを指定します。


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

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);