Exchange 2000徹底解剖
>
開発環境としてのExchange 2000 Server
|
Exchange 2000 Serverには,フォルダにアイテムが保存されたとき,あるいはフォルダからアイテムが削除されたときなどに発生するイベントをフックし,それに応じて処理を実現する機能が提供されている。この機能を「Event Sink」と呼ぶ。
冒頭でも少し説明したように,Event Sinkは,フォルダにアイテムを保存しようとしているとき,フォルダにアイテムを保存し終えたとき,フォルダからアイテムを削除しようとしているとき,フォルダからアイテムを削除し終えたとき,一定時間が経過したとき,ストアの動作が開始されたとき,ストアの動作が終了されようとしているときなどに,Exchange 2000 Serverにあらかじめ登録しておいたCOMコンポーネントを呼び出す仕組みである。呼び出されるCOMコンポーネントは,Visual BasicやVisual C++などの開発ツールで作成することになる。
|
まずは,Event Sinkの仕組みについて簡単に説明する。 ●イベントの種類
Event Sinkが発生するイベントには,次の4種類がある。
- 同期イベント(IExStoreSyncEvents)
- アイテムが保存されようとしているときや削除されようとしているときに発生する。このとき,保存されようとしているアイテムのデータをCOMコンポーネント側で取得することができる。そのため,このイベントを処理すれば,保存されようとしているアイテムを書き換えたり,アイテムの保存や削除を中止したりすることができる。
- 非同期的イベント(IExStoreAsyncEvents)
- アイテムの保存や削除が完了したときに発生する。このとき,保存または削除されたアイテムの場所(URL)を取得できるが,データの変更はできない。このイベントは主に,アイテムの保存や削除を通知するメールを送信したり,保存されたアイテムを加工して別のアイテムを作成(たとえば,Excelワークシートが保存されたときに,そのワークシートを読み込んで自動的にHTMLファイルを生成)したりする処理に用いられる。
- 登録イベント(ICreateRegistration)
- Exchange 2000 ServerのEvent SinkにCOMコンポーネントを登録する際に発生する。このイベントを処理することで,COMコンポーネントを初期化したり,登録を拒否して不正な登録を排除したりすることができる。
- システムイベント(IExStoreSystemEvents)
- 一定時間が経過したときや,Web Storage Systemが起動や停止したときに発生する。このイベントを処理することで,定期的にバックアップするなどの処理をすることができる。
これら4つのイベントのうち,同期イベントと非同期イベントは少々わかりにくいので,補足説明しておく。
Exchange 2000 Serverは,フォルダにアイテムが保存されようとしたときや削除されようとしたときに,Fig.2-22のような順序でイベントが発生する。
Fig.2-22を参照するとわかるように,Event Sinkでは,アイテムが保存されようとしたときや削除されようとしたときには,まず同期イベントが発生する。同期イベントは,状況に応じて1つのアイテムに対して複数回発生するが,必ず最初に引数にEVT_SYNC_BEGINフラグが伴われて呼び出され,最後にEVT_SYNC_COMITTEDフラグが伴われて呼び出されることになっている(ただし,保存ないし削除がCOMコンポーネント内の処理によって途中で中止された場合にはEVT_SYNC_COMMITEDフラグではなくEVT_SYNC_ABORTEDフラグが伴われる)。
- 同期イベントの開始
-
EVT_SYNC_BEGINフラグが伴われて同期イベントが呼び出されたときは,同期イベントの開始を示す。このとき,保存または削除されようとしているアイテムは,Exchange 2000 Serverの一時的な領域に保存されている。ただし,COMコンポーネント側から見ると,アイテムの保存場所(URL)は一時的な領域ではなく,実際に保存ないし削除されようとしている場所として見える。同期イベントを処理するCOMコンポーネントは,一時的な領域に保存されているアイテムを操作することで,保存または削除されようとしているアイテムを書き換えることができる。
また,この処理内で,IExStoreDispEventInfoインタフェースのAbortChangeメソッドを呼び出すと,アイテムの保存や削除を中止することができる(具体的な処理方法については後述する)。AbortChangeメソッドを呼び出した場合には,次に説明するEVT_SYNC_COMMITEDフラグの代わりに,EVT_SYNC_ABORTEDフラグが伴われて同期イベントが呼び出される。
- 同期イベントの完了
-
EVT_SYNC_COMMITEDフラグが伴われて同期イベントが呼び出されたときは,同期イベントの終了を示す。この呼び出しが発生したときには,すでに実際にアイテムが保存されたり削除されたりという処理が実施されている。よって,この時点でアイテムを書き換えることはできない。
- 非同期イベント
-
同期イベントが完了すると,今度は引き続き非同期イベントが発生する。ただし,非同期イベントは同期イベントが完了したとき,ただちに発生するとは保証されておらず,いくらかのタイムラグが発生する可能性がある(そのあたりが「非同期」といわれるゆえんである)。
非同期イベントが発生するときには,アイテムはすでに保存ないし削除されているから,非同期イベントの処理内でアイテムを更新することはできない。
同期イベントも非同期イベントも,1つのフォルダに対して複数のCOMコンポーネントを設定することができる。
ただし,同期イベントの場合には,保存されようとしているアイテムをCOMコンポーネントが更新する可能性があることから,複数設定するときにはCOMコンポーネントを呼び出す順序も重要になってくる。そのため,同期イベントでは,イベントの登録時にPriorityプロパティを使って優先順位を設定できるようになっている。非同期イベントの場合には優先順位という概念はなく,複数のCOMコンポーネントを設定したときに呼び出される順序は不定である。
Fig.2-22 同期イベントと非同期イベント(図版をクリックすると拡大可能)

| 22/27 |
