CEIは、履歴イベントをクエリーするために使われるEvent Accessインターフェースを提供します。イベントをクエリーするためには、イベント・グループと、オプションとしてイベント・セレクターを指定する必要があります(詳しくは、囲み記事、イベント・セレクターとイベント・グループを見てください)。CEIには、CBEViewerというアプリケーションが含まれており、これを使うことによって、指定されたイベント・グループに基づくイベント・クエリーを行うことができます。しかし、イベント・グループを作る前に、対応するイベント・セレクターをテストする必要があります。さらに、コード中でイベント・セレクターとイベント・グループを組み合わせて使う前に、その組み合わせをテストしたいこともあるかも知れません。この記事では、イベント・セレクターやイベント・グループ、そして、イベント・セレクターと組み合わせたイベント・グループをテストするための、EventTesterというアプリケーションを提示します。また、このアプリケーションをCBEViewerアプリケーションと組み合わせ、イベント・セレクターを作る方法についても解説します。
CEIはXPath構文のサブセットをサポートしており、これを使ってイベントをクエリーします。イベントのクエリーは、EventAccessセッションbean実装である、Event Accessインターフェースを使って行います。EventAccess beanのインスタンスは、対応するホーム・インターフェースを使って作ることができます。これをリスト1 に示します。
リスト1. EventAccess beanのインスタンスを作る
// use home interface to create remote event access bean
InitialContext context = new InitialContext();
Object eventAccessHomeObj =
context.lookup("ejb/com/ibm/events/access/EventAccess");
EventAccessHome eventAccessHome = (EventAccessHome)
PortableRemoteObject.narrow(eventAccessHomeObj,
EventAccessHome.class);
eventAccess = (EventAccess) eventAccessHome.create();
|
Event Accessインターフェースは、次のようなイベント・クエリー方法をサポートしています。
- グローバル・インスタンス識別子による方法 -- プライマリー・キーとして使用する
globalInstandIdイベント・プロパティーを使って、イベントを取得します。
CommonBaseEvent event = eventAccess.queryEventByGlobalInstanceId(eventId);
- イベント・グループによる方法 -- 指定されたイベント・グループに属する、また(オプションとして)イベント・セレクターを使って規定される基準に合致するイベントを検索します。
ascendingOrderパラメーターは、イベントの作成時間に従って、イベントを昇順または降順に並べるために使います。maxEventパラメーターは、イベント・クエリーから返されるべきイベントの数の最大値を規定するために使います。
CommonBaseEvent[] events = eventAccess.queryEventsByEventGroup(eventGroup, eventSelector,
- 関連タイプ(Association type)による方法 -- 与えられたイベントに対して、
associationTypeで関連付けられるイベントを検索します。イベントは、関連した、あるいは関連付けられた他のイベントを持つこともできます。関連付けタイプ属性は、containsやcleared、causedBy、multiPart、correlatedなどのような、関係の形式を定義します。
CommonBaseEvent[] events = eventAccess.queryEventsByAssocation(associationType, eventId);
EventTesterアプリケーションは、Event Accessインターフェース・ベースのアプリケーションであり、これを使ってイベント・セレクターやイベント・グループをテストすることができます。完全なコードは、ダウンロード・セクションにあります(この記事の先頭または最後にある、codeアイコンをクリックしてダウンロードしてください)。図1は、このアプリケーションのGUI(graphic user interface)を示しています。このアプリケーションは、イベント・グループとイベント・セレクターを与えると、それに対応したイベントを返します。またイベント・セレクターは別途、イベント・グループに対するデフォルト値、All eventsを使ってテストすることもできます。同様に、イベント・グループも別途、イベント・セレクターに対するデフォルト値、CommonBaseEvent[@globalInstanceId]を使ってテストすることもできます。イベントは表形式で示され、各行がイベントを表します。
図1. Event Testerアプリケーション
このアプリケーションは、JSP(Java Server Page)とサーブレットを含んでいます。リスト2とリスト3 (コード・リストはサイドファイルにあります)は、それぞれ、このアプリケーションのJSPコードとサーブレット・コードを示しています。JSPは、アプリケーションのフロントエンドを提供します。Display Eventsボタンをクリックすると、DisplayEventsサーブレットが呼び出されます。このサーブレットは、Event Accessインターフェースを使ってイベントをクエリーし、その結果をJSPに転送します。そうするとJSPはイベントをフォーマットして、ユーザーに提示します。JSPは、フォーマットするイベントはCBE version 1.0.1であると想定しています(CBEの詳細に関しては、参考文献にある、Standardize messages with the Common Base Event modelを見てください)。
EventTesterアプリケーションは、単独で使うことも、CBEViewerアプリケーションと併せて使うこともできます。CBEViewerの方がユーザー・インターフェースやフィルタリング機構は優れているので、私はEventTesterアプリケーションをCBEViewerアプリケーションと併せて使うようにお勧めします。まずCBEViewerを使って全イベントをクエリーし(All Events イベント・グループを使います)、対象としているイベントの構造やパターンを理解します。次にそれに対応するXPathクエリーを作り、EventTesterアプリケーションを使ってテストします。
例えば、「BusinessRelevant;」とマーク付けされたMileStoneManagerというプロセスがあるとしましょう。このプロセスは、開始する時も停止する時も、必ずイベントを出力します。その開始イベントと、それに対応する停止イベントの全てをクエリーしようというわけです。イベントの構造を理解するために、CBEViewerアプリケーションを使います。図2 は、CBEViewerに表示された、そうしたイベントを示し、図3 と図4は、その詳細です。開始イベントの詳細から、イベントに対する extensionName が「WPC:ProcessInstanceEvent」であることが分かります。これには「processTemplateName」という extendedDataElement があり、このイベントがMileStoneManagerによって出力されたことを示しています。また、この状況に対する categoryName は「StartSituation」であることから、このイベントがプロセスの開始で出力されたことが分かります。同様に、停止イベントの詳細から、このイベントに対する extensionName も同じく「WPC:ProcessInstanceEvent」であることが分かります。このイベントがMileStoneManagerによって出力されたものであることを示すフィールドはありませんが、このイベントの contextDataElement は、開始イベントに対する contextDataElement と同じであり、状況に対する categoryName は「StopSituation」です。
図2. CBEViewerアプリケーション
下記は、MileStoneManager開始イベントの詳細です。
表1. MileStoneManager開始イベントの詳細
| 名前 | 値 |
|---|---|
| version | -1.0.1 |
| globalInstanceId | CEC05DB5C52F6E90339824ECD0334F11D9 |
| extensionName | WPC:ProcessInstanceEvent |
| localInstanceId | |
| creationTime | 2004-11-10T19:34:53.213Z |
| severity | 10 |
| msg | |
| priority | - |
| sequenceNumber | 1 |
| repeatCount | 0 |
| elapsedTime | 0 |
| ContextDataElement: ECSCurrentID / contextValue | _PI:10030100.23fb340d.ac3cd9f6.136200b8 |
| ContextDataElement: ECSParentID / contextValue | _PI:10030100.23fb33fe.ac3cd9f6.136200a6 |
| ExtendedDataElement: Username | UNAUTHENTICATED |
| ExtendedDataElement: processTemplateName | MileStoneManager |
| ExtendedDataElement: processTemplateId | _PT:90010100.22fcafbd.ac3cd9f6.cfc80161 |
| ExtendedDataElement: processInstanceId | _PI:10030100.23fb340d.ac3cd9f6.136200b8 |
| ExtendedDataElement: processInstanceExecutionState | 2 - STATE_RUNNING |
| ExtendedDataElement: processTemplateValidFrom | Wed 2003-01-01 00:00:00.000 |
| reporterComponentId | |
| sourceComponentId / component | WBI-SF#Platform 5.1 [BASE 5.1.1 a0426.01] [JDK 1.4.1 ${build.level}] [PME 5.1.1 o0429.02] |
| sourceComponentId / subComponent | WPC |
| sourceComponentId / componentIdType | ProductName |
| sourceComponentId / instanceId | localhost\localhost\server1 |
| sourceComponentId / application | |
| sourceComponentId / executionEnvironment | Windows 2000[x86]#5.0 |
| sourceComponentId / location | naveen.transarc.ibm.com |
| sourceComponentId / locationType | Hostname |
| sourceComponentId / processId | 1520 |
| sourceComponentId / threadId | Servlet.Engine.Transports : 0 |
| sourceComponentId / componentType | http://www.ibm.com/namespaces/autonomic/Workflow_Engine |
| msgDataElement | |
| situation / categoryName | StartSituation |
| situation / situationType / reasoningScope | EXTERNAL |
| situation / StartSituation / successDisposition | SUCCESSFUL |
| situation / StartSituation / situationQualifier | START_COMPLETED |
次の表は、MileStoneManager停止イベントの詳細です。
表2. MileStoneManager停止イベントの詳細
| 名前 | 値 |
|---|---|
| version | 1.0.1 |
| globalInstanceId | CEC05DB5C52F6E9033D38E4690334F11D9 |
| extensionName | WPC:ProcessInstanceEvent |
| localInstanceId | |
| creationTime | 2004-11-10T19:36:32.889Z |
| severity | 10 |
| msg | |
| priority | - |
| sequenceNumber | 1 |
| repeatCount | 0 |
| elapsedTime | 0 |
| ContextDataElement: ECSCurrentID / contextValue | _PI:10030100.23fb340d.ac3cd9f6.136200b8 |
| ContextDataElement: ECSParentID / contextValue | _PI:10030100.23fb340d.ac3cd9f6.136200b8 |
| ExtendedDataElement: WPCEventCode | 21004 |
| ExtendedDataElement: processInstanceExecutionState | 3 - STATE_FINISHED |
| reporterComponentId | |
| sourceComponentId / component | WBI-SF#Platform 5.1 [BASE 5.1.1 a0426.01] [JDK 1.4.1 ${build.level}] [PME 5.1.1 o0429.02] |
| sourceComponentId / subComponent | WPC |
| sourceComponentId / componentIdType | ProductName |
| sourceComponentId / componentIdType | localhost\localhost\server1 |
| sourceComponentId / application | |
| sourceComponentId / executionEnvironment | Windows 2000[x86]#5.0 |
| sourceComponentId / location | naveen.transarc.ibm.com |
| sourceComponentId / locationType | Hostname |
| sourceComponentId / processId | 1520 |
| sourceComponentId / threadId | Servlet.Engine.Transports : 0 |
| sourceComponentId / componentType | http://www.ibm.com/namespaces/autonomic/Workflow_Engine |
| msgDataElement | |
| situation / categoryName | StopSituation |
| situation / situationType / reasoningScope | EXTERNAL |
| situation / StopSituation / successDisposition | SUCCESSFUL |
| situation / StopSituation / situationQualifier | STOP_COMPLETED |
開始イベントの詳細から、次のようなイベント・セレクターを作り、MileStoneManager開始イベントの全てをクエリーすることができます。
CommonBaseEvent[extensionName='WPC:ProcessInstanceEvent'] and extendedDataElement[name='processTemplateName' and type='string' and values='MileStoneManager'] and situation[categoryName='StartSituation'] |
このイベント・セレクターは、EventTesterアプリケーションを使ってテストすることができます。これを図3に示します。このページは、上記のイベント・セレクターに基づくイベントの詳細を表示しています。これでイベント・セレクターが動作することが分かったので、今度は対応するイベント・グループ、MileStoneManagerStartEventGroupを作ります(イベント・グループの作り方の詳細については、参考文献にある、「On demand business process life cycle, Part 8: Business process monitoring -- Create key performance indicators」を見てください)。これも、EventTesterアプリケーションを使ってテストすることができます。
図3. 開始イベント・セレクターをテストする
与えられた開始イベントに対する停止イベントをクエリーするには、次のようなイベント・セレクターを使います。
CommonBaseEvent[extensionName='WPC:ProcessInstanceEvent' and situation[categoryName='StopSituation'] and contextDataElements[name='ECSCurrentID' and type='ECSID' and values='<start event values>']] |
ここで、<start event values>(例えばPI:10030100.23fb340d.ac3cd9f6.136200b8)は実行時に指定します。
イベント・グループは、静的なイベント・セレクターに対してしか作ることができないため、このイベント・セレクターに対応するイベント・グループは作ることができません。しかし、このイベント・セレクターは下記に示すように、2つのイベント・セレクターに分割することができます。
CommonBaseEvent[extensionName='WPC:ProcessInstanceEvent' and situation[categoryName='StopSituation']]CommonBaseEvent[contextDataElements[name='ECSCurrentID' and type='ECSID' and values='<start event values>']]
今度は、最初のイベント・セレクターに対応するProcessStopEventGroupを作り、これを2番目のイベント・セレクターと一緒に使うことで、適当な停止イベントをクエリーします(イベント・グループの作り方の詳細については、参考文献にある「On demand business process life cycle, Part 8: Business process monitoring -- Create key performance indicators」を見てください)。対応のコードを書く前にこのシナリオをテストするためにも、EventTesterアプリケーションを使うことができます。これを図4に示します。
図4. 停止イベント・セレクターをテストする
この記事では、イベント・グループとイベント・セレクターをテストするための、CEI(Common Event Infrastructure)ベースのアプリケーションを構築する方法を学びました。また、このアプリケーションでイベント・アクセス・インターフェースを使い、指定されたイベント・セレクターとイベント・グループに基づいて履歴イベントをクエリーする方法、そして、「Business Relevant」とマーク付けされたプロセスに対して、イベント・セレクターを構築する方法についても学びました。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| イベント・テスターWARファイル | ws-ceicode.zip | 9KB | HTTP |
- XPathの制限に関する詳細については、Information center for WebSphere Business Integration Server Foundation -- Writing event selectorsを見てください。
- イベント・グループの作り方については、「On demand business process life cycle, Part 8: Business process monitoring -- Create key performance indicators」(developerWorks, 2005年3月)を見てください。
- CBEモデルをさらに学ぶために、「Common Base Eventモデルでメッセージを標準化する」(developerWorks, 2004年2月)を見てください。
- Developer Bookstoreには、Webサービス関連の書籍を含めて、広範な話題を網羅した技術書が豊富に取り揃えられていますので、ぜひご覧ください。
- developerWorks blogsに参加してdeveloperWorksコミュニティーに加わってください。
- IBM developerWorksチームは、世界中で何百回もの technical briefings を開催しています。どれも無料で参加することができます。
- developerWorksの SOA and web services ゾーンでは、豊富な記事と、初心者から中級者、そして上級者まで幅広い方々に役立つ、Webサービス・アプリケーションの構築方法に関するチュートリアルを提供しています。