级别: 初级 Naveen Sachdeva (sachdeva@us.ibm.com), 咨询软件工程师, IBM
2005 年 4 月 01 日 学习如何构建基于公共事件基础架构(Common Event Infrastructure,CEI)的应用程序用于测试事件群和事件选择器。作者提出这种称为 EventTester 的应用程序,然后向您展示了将事件访问接口用于基于指定的事件选择器和事件群来查询历史事件。本文向您展示了如何为基于业务流程执行语言(Business Process Execution Language,BPEL)的标有“Business Relevant”的流程创建事件选择器。
引言
CEI 为您提供了可以用来查询历史事件的事件访问接口。为了查询事件,您需要指定一个事件群,并且随意指定一个事件选择器(请见侧栏的事件选择器和事件群来获取更多信息)。CEI 包括了应用程序——CBEViewer——您可以用于查询基于指定事件群的事件。但是在您创建事件群之前,需要测试相应的事件选择器。除此之外,您也可以在使用这样的组合代码之前与事件群一起测试事件选择器。本文提出了应用程序——EventTester——您可以利用它来测试事件选择器、事件群以及使用事件选择器的事件群。本文同时也向您展示了如何使用该应用程序与 CBEViewer 应用程序的组合来创建事件选择器。
事件访问(Event Access)接口
CEI 支持 XPath 语法的子集来进行事件查询。您可以使用事件访问接口来查询事件,该接口是由 EventAccess 会话 bean 实现。您可以使用相应的本机接口来创建 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();
|
 |
事件选择器和事件群
事件选择器是一种常规表达式,它定义了一组基于这些事件的特性数据(属性或者子元素)的事件。例如,事件选择器可能指定了来自一个特殊主机的所有的事件,该主机带有超过 30 个(警告信息)的安全规定。由于该 CBE 规范是基于 XML 的,所以使用 XPath 语法子集(有关 XPath 限定的详细信息请参考参考资料部分中的 WebSphere Business Integration Server Foundation 信息中心——编写事件选择器)来编写事件选择器。
|
|
Event Access 接口支持以下的查询事件的方法:
- 全局实例标识符——使用它的可以用作主关键字的
globalInstandId 事件特性来获取事件。
CommonBaseEvent event =
eventAccess.queryEventByGlobalInstanceId(eventId);
- 事件群——检索属于指定事件群的事件并且使用事件选择器来(随意地)匹配指定的标准。使用
ascendingOrder 参数按照事件创建的时间以升序或者降序的方式命令事件。maxEvent 参数用于指定从事件查询返回的事件的最大数目。
CommonBaseEvent[] events =
eventAccess.queryEventsByEventGroup(eventGroup, eventSelector,
- 关联类型——通过
associationType 检索相关的事件来获取给定的事件。事件可以有其它相关的或者关联的事件。关联类型属性定义了关系类型,例如:contains、cleared、causedBy、multiPart 或者 correlated。
CommonBaseEvent[] events =
eventAccess.queryEventsByAssocation(associationType,
eventId);
EventTester 应用程序
EventTester 应用程序是一个基于事件访问接口的应用程序,您可以使用它来测试事件选择器和事件群。在下载(Download)部分中有可用的完整代码(单击本文顶部或者底部的 code 图标来下载代码)。图 1 展示了用于该应用程序的图形用户接口。给定事件群及事件选择器,此应用程序将返回相应的事件。您也可以通过使用事件群的缺省值或者 All events 来分别测试事件选择器。类似地,您可以通过使用事件选择器的缺省值或者 CommonBaseEvent[@globalInstanceId] 来分别测试事件群。 这些事件以表格的格式显示,每行代表了一个事件。
图 1. 事件测试器(Event Tester)应用程序
该应用程序包括了一个 Java Server Page(JSP)和一个 servlet。清单 2 和清单 3(侧面的文件中显示了代码清单)分别显示了该应用程序的 JSP 和 servlet 代码。JSP 提供了该应用程序的前端部分。当您单击 Display Events 按钮时,它调用了 DisplayEvents servlet。该 servlet 使用事件访问接口来查询事件,并且将结果提交给 JSP。然后该 JSP 编排这些事件,并将它们显示给用户。为了编排这些事件,JSP 假定这些事件是 CBE 版本 1.0.1 的(有关 CBE 的详细信息,请参考参考资料部分中的使用通用基础事件(Common Base Event)模型来标准化消息)。
使用 EventTester 应用程序
您可以通过或者不通过 CBEViewer 应用程序来使用 EventTester 应用程序。因为 CBEViewer 有一个更好的用户接口和过滤机制,所以我建议通过利用 CBEViewer 应用程序来使用 EventTester 应用程序。您可以首先使用 CBEViewer 来查询所有的事件(使用 All Events 事件群)并了解您所感兴趣的事件的结构或者模式,然后创建相应的 XPath 查询,并使用 EventTester 应用程序对其进行测试。
例如,假设您有一个名为 MileStoneManager 的流程,标有“BusinessRelevant”;换句话说,无论在它启动或者停止的时候都会发出事件,并且您对查询所有的启动事件和相关的停止事件感兴趣。为了理解这些事件的结构,您使用 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 启动事件的详细信息
|
名称
|
值
| | 版本 | -1.0.1 | | globalInstanceId | CEC05DB5C52F6E90339824ECD0334F11D9 | | extensionName | WPC:ProcessInstanceEvent | | localInstanceId | | | creationTime | 2004-11-10T19:34:53.213Z | | 严格性 | 10 | | msg | | | 优先权 | - | | 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 中止事件的详细信息
|
名称
|
值
| | 版本 | 1.0.1 | | globalInstanceId | CEC05DB5C52F6E9033D38E4690334F11D9 | | extensionName | WPC:ProcessInstanceEvent | | localInstanceId | | | creationTime | 2004-11-10T19:36:32.889Z | | 安全 | 10 | | msg | | | 优先权 | - | | 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(有关如何创建事件群的详细信息,请参考参考资料部分中的“随需应变的业务流程生命周期,第 8 部分:业务流程监督——创建关键性能指示器”),然后使用 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)。
因为事件群只能创建成静态事件选择器,所以您不能创建该事件选择器相应的事件群。但是您可以将该事件选择器分为两个事件选择器,如下所示:
-
CommonBaseEvent[extensionName='WPC:ProcessInstanceEvent' and situation[categoryName='StopSituation']]
-
CommonBaseEvent[contextDataElements[name='ECSCurrentID' and type='ECSID' and values='<start event values>']]
既然您已经创建了第一个事件选择器相应的 ProcessStopEventGroup,并且利用第二个事件选择器来使用它进行查询合适的停止事件(有关如何创建事件群的详细信息,请参考参考资料部分中的“随需应变的业务流程生命周期,第 8 部分:业务流程监督——创建关键性能指示器”)。但是在您编写相应的代码之前,可以使用 EventTester 应用程序来测试该场景,如图 4 所示。
图 4. 测试停止事件选择器
结束语
本文中,您学会了如何构建基于 Common Event Infrastructure(CEI)的应用程序用于测试事件群和事件选择器。您也学会了该应用程序如何使用事件访问接口来查询基于指定事件选择器和事件群的历史事件,以及如何为标有“Business Relevant”的流程创建事件选择器。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Event tester WAR file | ws-ceicode.zip | 9 KB | HTTP |
|---|
参考资料
关于作者  | |  | Naveen Sachdeva 是 IBM Application Integration Middleware 开发小组 WebSphere Competency Center 的一名咨询软件工程师。他在大规模系统集成以及分布式计算系统的设计和开发方面有超过 10 年的经验。目前他使用 IBM 产品帮助业务伙伴从事技术实现和提供概念验证。 |
对本文的评价
|