この章では、最初に CIM イベントモデルについて説明し、次にプロバイダで CIM イベントを生成する方法と、CIM イベントの発生をアプリケーションに通知するように予約する方法について説明します。
イベントとは、1 つの事象 (発生したもの) を表す言葉です。プログラミング用語では、イベントはコンピュータシステム内での 1 つの事象を意味します。そして、通常アプリケーションは、これに応答する必要があります。たとえば、GUI 上のマウスクリックに応じてダイアログボックスを開く場合です。CIM イベントは、管理環境において目的の事象に変化があったことを意味します。
CIM イベントモデル (CIM イベントを処理するフレームワーク) は、DMTF (Desktop Management Task Force) によって公表された CIM (Common Information Model) Indications Specification に準拠しています。CIM イベントモデルでは、イベントとそのイベントの通知 (インジケーション) は区別されます。CIM では、発行されるのはインジケーションであり、イベントではありません。
CIM イベントは、内部イベントと外部イベントに分類されます。内部イベントとは、ネームスペース、クラス、クラスインスタンスの、作成、変更、削除といったデータの変更に対応して発生する組み込み型の CIM イベントです。外部イベントとは、内部イベントによって記述されていないユーザー定義型のイベントです。
現在は、CIM インスタンスの作成、変更、削除に対応する内部イベントだけが処理されます。内部イベントを報告するクラスには、次のものがあります。
CIM_InstCreation — 新しいインスタンスが作成されたことを表します。
CIM_InstDeletion — 既存のインスタンスが削除されたことを表します。
CIM_InstModification — インスタンスが変更されたことを表します。
デフォルトでは、CIM Object Manager は、内部イベントのインジケーションを一定間隔でポーリングします。イベントポーリングの間隔や CIM Object Manager のデフォルトのポーリング動作を変更するには、cimom.properties ファイルのプロパティを編集します。cimom.properties ファイルの編集方法については、『Solaris WBEM Services の管理』を参照してください。
CIM Object Manager は、指定されたポーリング間隔でインスタンスを列挙し、列挙された 2 つのインスタンスセットの間にインスタンスの追加や変更、削除があったかどうかを判定します。プロバイダがイベントのインジケーションを生成する場合には、CIM Object Manager はこのプロバイダをポーリングしません。プロバイダは、可能な場合は、サポートするクラスの動的インスタンスで発生する内部イベントのインジケーションを生成する必要があります。これによって、CIM Object Manager がイベントをポーリングすることによるパフォーマンスの低下を避けることができます。
CIM Object Manager Repository は、内部インスタンスが作成、変更、または削除されると、インジケーションを生成します。
クライアントアプリケーションでは、CIM イベント発生が通知されるように予約することができます。予約は、1 つまたは複数の目的のインジケーションを宣言することによって行います。現在は、プロバイダがイベントインジケーションを予約することはできません。
CIM イベントのインジケーションの通知予約するアプリケーションには、次の指定が必要です。
目的のイベント
イベントが発生した時に、CIM Object Manager が行うアクション
予約を作成するには、CIMListener インタフェースを追加し、次のクラスのインスタンスを作成します。
CIM_IndicationFilter — インジケーションを生成する基準と、インジケーションとしてどのようなデータを返すかを定義します。
CIM_IndicationHandler — インジケーションをどのように処理し、送信する (扱う) かを定義します。ここでは、インジケーションの送信に使用する宛先とプロトコルを定義することがあります。
CIM_IndicationSubscription — 特定のイベントフィルタと特定のイベントハンドラをバインドする関連付け。
アプリケーションは、1 つまたは複数のイベントフィルタと 1 つまたは複数のイベントハンドラを作成できます。イベントインジケーションは、アプリケーションがイベントの予約を作成するまで送信されません。
クライアントアプリケーションは、CIMListener インタフェースを追加することによって、CIM イベントインジケーションの予約を登録する必要があります。CIM Object Manager は、クライアント予約が作成されたときにイベントフィルタに指定された CIM イベントのインジケーションを生成します。
CIMListener インタフェースには、indicationOccured メソッドを実装する必要があります。このメソッドは、引数として CIMEvent (CIMListener から返される 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) だけがサポートされます。
表 6–1 CIM_IndicationFilter クラスのプロパティ
プロパティ |
説明 |
必須/任意 |
---|---|---|
SystemCreationClassName |
このフィルタを作成するクラスがあるシステムの名前、またはこのクラスが適用されるシステムの名前。 |
任意。このキープロパティのデフォルトは CIM_System.CreationClassName。 |
SystemName |
このフィルタがあるシステムの名前、またはこのフィルタが適用されるシステムの名前。 |
任意。このキープロパティのデフォルトは、CIM Object Manager が動作しているシステムの名前。 |
CreationClassName |
このフィルタの作成に使用するクラスまたはサブクラスの名前。 |
任意。CIM Object Manager は、このキープロパティのデフォルトとして CIM_IndicationFilter を割り当てる。 |
Name |
このフィルタの固有名。 |
必須。クライアントアプリケーションは固有名を指定する必要がある。 |
SourceNamespace |
CIM インジケーション生成元であるローカルネームスペースへのパス。 |
任意。デフォルトは \root\cimv2。 |
Query |
インジケーションをどのような条件のときに生成するかを定義する照会式。現在は、Level 1 の WQL 式だけがサポートされる。WQL 照会式の作成方法については、照会を参照。 |
必須。 |
QueryLanguage |
照会を表現する言語。 |
必須。デフォルト WQL (WBEM Query Language)。 |
CIM_IndicationFilter クラスのインスタンスを作成します。以下に例を示します。
CIMClass cimfilter = cc.getClass (new CIMObjectPath(“CIM_IndicationFilter”), true, true, true, null);CIMInstance ci = cimfilter.newInstance(); |
イベントフィルタの名前を指定します。以下に例を示します。
Name = “filter_all_new_solarisdiskdrives” |
WQL 文字列を作成し、返されるイベントインジケーションを指定します。以下に例を示します。
String filterString = “SELECT * FROM CIM_InstCreation WHERE sourceInstance is 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 Object Manager Repository に格納します。以下に例を示します。
CIMObjectPath filter = cc.createInstance(new CIMObjectPath(), ci); |
イベントハンドラは、CIM_IndicationHandler クラスのインスタンスです。CIM イベント MOF には、HTTP プロトコルを使ってクライアントアプリケーションに送信されるインジケーションの宛先を指定する CIM_IndicationHandlerXMLHTTP クラスが定義されています。イベントの HTTP 送信はまだ定義されていないため、HTTP クライアントへのイベントの送信はサポートされていません。
Solaris イベント MOF は、Solaris_RMIDelivery クラスを作成して CIM_IndicationHandler クラスを拡張し、RMI プロトコルを使用して CIM イベントインジケーションのクライアントアプリケーションへの送信を処理します。RMI クライアントは、Solaris_RMIDelivery クラスのインスタンスを作成して、RMI 送信の場所を設定する必要があります。
アプリケーションでは、CIM_IndicationHandler クラスのプロパティにハンドラの固有名とその所有者の UID を指定します。
表 6–2 CIM_IndicationHandler クラスのプロパティ
プロパティ |
説明 |
必須/任意 |
---|---|---|
SystemCreationClassName |
このハンドラを作成するクラスがあるシステムの名前、またはこのクラスが適用されるシステムの名前。 |
任意。このキープロパティのデフォルトは CIM_System クラスを作成するクラス |
SystemName |
このハンドラがあるシステムの名前、またはこのハンドラが適用されるシステムの名前。 |
任意。このキープロパティのデフォルト値は、CIM Object Manager が動作しているシステムの名前。 |
CreationClassName |
このハンドラの作成に使用するクラスまたはサブクラス。 |
任意。CIM Object Manager は、このキープロパティのデフォルトとして CIM_IndicationFilter を割り当てる。 |
Name |
このハンドラの固有名。 |
必須。クライアントアプリケーションは固有名を指定する必要がある。 |
Owner |
このハンドラを作成した、または保持するエンティティの名前。プロバイダは、この値を検査して、インジケーションの受信をハンドラに承認するかどうかを確認できる。 |
任意。デフォルトは、このインスタンスを作成するユーザーの Solaris ユーザー名。 |
次のコード例は、CIM イベントハンドラの作成方法を示したものです。
// Solaris_RMIDelivery クラスのインスタンスを作成する CIMClass rmidelivery = cc.getClass(new CIMObjectPath (“Solaris_RMIDelivery”), false, true, true, null); CIMInstance ci = rmidelivery.newInstance(); // rmidelivery インスタンスから新しい // インスタンス (delivery) を作成する CIMObjectPath delivery = cc.createInstance(new CIMObjectPath(), ci);
アプリケーションは、CIM_IndicationSubscription クラスのインスタンスを作成して、イベントフィルタとイベントハンドラをバインドします。CIM_IndicationSubscription を作成すると、イベントフィルタによって指定されたイベントのインジケーションが送信されます。
次の例では、予約 (filterdelivery) を作成し、次に イベントフィルタを作成する方法で作成した filter オブジェクトに filter プロパティを定義し、例 6–2 で作成した delivery オブジェクトに handler プロパティを設定します。
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));
CIM イベントのインジケーションを生成するには、次の処理が行われます。
EventProvider インタフェースのメソッドを使って、CIM イベントインジケーションの送信をいつ開始および停止するかを検出する。
CIM_Indication クラスの 1 つまたは複数のサブクラスのインスタンスを作成して、発生した CIM イベントの情報を格納する。
ProviderCIMOMHandle インタフェースの deliverEvent メソッドを使って、インジケーションを CIM Object Manager に送信する。
イベントプロバイダは、EventProvider インタフェースを実装する必要があります。CIM Object Manager は、このインタフェースのメソッドを使って、クライアントが CIM イベントのインジケーションを予約したり、CIM イベントの予約を取り消したことをプロバイダに知らせます。さらにこれらのメソッドによって、プロバイダは、CIM Object Manager が特定のイベントインジケーションのポーリングを行うべきかどうか、インジケーションをハンドラに返すことを承認するかどうかを指定します。
次の表に、イベントプロバイダが実行しなければならない EventProvider インタフェースのメソッドを示します。
表 6–3 EventProvider インタフェースのメソッド
メソッド |
説明 |
---|---|
activateFilter |
クライアントが予約を登録すると、CIM Object Manager は、このメソッドを呼び出して CIM イベントの検査をプロバイダに依頼する。 |
authorizeFilter |
クライアントが予約を登録すると、CIM Object Manager は、このメソッドを呼び出して指定されたフィルタ式が許可されているかを検査する。 |
deActivateFilter |
クライアントが予約を削除すると、CIM Object Manager は、このメソッドを呼び出して指定されたイベントフィルタの停止をプロバイダに依頼する。 |
mustPoll |
クライアントが予約を削除すると、CIM Object Manager は、このメソッドを呼び出して、指定されたフィルタ式をプロバイダが許可するかどうか、そのフィルタ式のポーリングが必要かどうかを検査する。 |
CIM Object Manager は、すべてのメソッドに次の引数の値を渡します。
filter — インジケーションを生成する必要がある CIM イベントを指定する SelectExp 型。
eventType — CIM イベントの型を指定する String 型。これは、select 式の FROM 節から抽出することもできます。
classPath — このイベントを必要とするクラスの名前を指定する CIMObjectPath 型。
さらに、activateFilter メソッドは、これがこのイベント型の最初のフィルタであることを示すブール値 firstActivation を受け取ります。deActivateFilter メソッドは、これが最後のフィルタであることを示すブール値 lastActivation を受け取ります。
クライアントアプリケーションが CIM_IndicationSubscription クラスのインスタンスを作成して CIM イベントのインジケーションを予約すると、CIM Object Manager はこの要求を適切なプロバイダに転送します。プロバイダが EventProvider インタフェースを実装していれば、CIM Object Manager は、プロバイダの activateFilter メソッド/deActivateFilter メソッドを呼び出して、指定するイベントのインジケーションの送信をいつ開始/停止するかをプロバイダに通知します。
プロバイダは、インスタンスを作成、変更、削除するたびに、インジケーションを作成、送信して、CIM Object Manager の要求に応答します。通常プロバイダは、CIM Object Manager が activateFilter メソッド/deActivateFilter メソッドを呼び出した時に設定/クリアされるフラグ変数を定義します。そして、インスタンスを作成、変更、または削除するメソッドの中で、アクティブなフラグのステータスを検査します。フラグが設定されている場合、プロバイダは、作成した CIM インスタンスオブジェクトを含むインジケーションを作成し、deliverEvent メソッドを使ってこのインジケーションを CIM Object Manager に返します。フラグが設定されていない場合、プロバイダは、イベントインジケーションの作成や送信を行いません。
機密データを扱うプロバイダは、インジケーションの要求に対する承認を検査することができます。その場合、プロバイダは Authorizable インタフェースを実装して、そのプロバイダが承認を検査することを示す必要があります。さらに、プロバイダは authorizeFilter メソッドを実装する必要があります。CIM Object Manager は、このメソッドを呼び出して、イベントハンドラの所有者 (UID) がフィルタ式の評価に基づいて送信されるインジケーションを受信することを承認されているかどうかを検査します。イベントの宛先の所有者 (イベントハンドラ) の UID は、フィルタをアクティブにすることを要求するクライアントアプリケーションの所有者と同じである必要はありません。
プロバイダは、CIM_Indication クラスのサブクラスのインスタンスを作成することによって、CIM イベントのインジケーションを生成します。
次の表に、プロバイダが生成すべき内部 CIM イベントを示します。
表 6–4 CIM イベントインジケーションクラス
イベントクラス |
説明 |
---|---|
CIM_InstCreation |
新しいインスタンスが作成されたことを知らせる。 |
CIM_InstDeletion |
既存のインスタンスが削除されたことを知らせる。 |
CIM_InstModification |
インスタンスが変更されたことを知らせる。インジケーションには、変更される前のインスタンスのコピーが含まれていなければならない。 |
EventProvider インタフェースを実装します。以下に例を示します。
public class sampleEventProvider implements InstanceProvider EventProvider{ // プロバイダが CIM Object Manager に接続するための参照 private ProviderCIMOMHandle cimom; }
プロバイダが処理するインスタンスインジケーションに対して、表 6–3 に示すそれぞれのメソッドを実行します。
作成、変更、削除のインスタンスのイベント型ごとに、表 6–4 に示すインジケーションを作成します。以下に createInstance メソッドの例を示します。
public CIMObjectPath createInstance(CIMObjectPath op, CIMInstance ci) throws CIMException { CIMObjectpath newop = ip.createInstance(op, ci); CIMInstance indication = new CIMInstance(); indication.setClassName("CIM_InstCreation"); CIMProperty cp = new CIMProperty(); cp.setName("SourceInstance"); cp.setValue(new CIMValue(ci)); Vector v = new Vector(); v.addElement(cp); indication.setProperties(v); ... }
イベントインジケーションを CIM Object Manager に送信します。以下に例を示します。
cimom.deliverEvent(op.getNameSpace(), indication); return newop;