级别: 初级 Naveen Sachdeva (sachdeva@us.ibm.com), 咨询软件工程师, IBM Joshy Joseph, 高级工程师, IBM
2005 年 3 月 01 日 使用公共事件基础架构(Common Event Infrastructure,CEI)来比较发出事件的四种不同方法。作者向您展示了如何使用 IBM® WebSphere® Business Integration Modeler V5.1 来编辑关键性能指示器(key performance indicators,KPIs),以及在 WebSphere Business Integration Server Foundation V5.1.1 中如何创建相应的事件。
引言
您可以使用 IBM® WebSphere® Business Integration Server Foundation V5.1.1(Business Integration Server)中的 CEI 来创建并以统一的格式分发事件,以及检索并查询这些事件。特别是,使用事件来发出业务流程的相关信息,您可以使用这些信息来计算业务流程规格或 KPI。在该系列文章的第 1 部分中,我们引入了定制加工处理系统(Order to Manufacturing Processing System,OTMPS)的随需应变业务流程场景,连同下面的 KPI:
- 平均定制吞吐量。被处理的定制总数/总共耗费的时间
- 成功率。成功结束的流程实例的数目/流程实例的总数
- 无效定制的数目。没有通过确认的定制的总数
- 平均的故障排除时间。以秒为单位,排除系统故障所需的平均时间
 |
关键性能指示器
关键性能指示器(key performance indicator,KPI)是一种可以计量的测量方法,它由所有者定义,反映了关键的业务成功因素。查看流程需要仪表板来显示依赖于 KPI 的流程的实际性能。例如,KPI 可以与所需的上下限相关联,并且当相应的规格数组超出了所需的范围就发出适当的警报。
|
|
本文中,我们向您展示了如何编辑 WebSphere Business Integration
Modeler V5.1(Business Integration Modeler)中的业务流程的 KPI,并在 Business Integration Server 中创建了相应的事件。在 Business Integration Server 中,您可以使用下面任何一种来创建事件:
- CEI API
- Event Correlation Spheres(ECS) API
- State Observer Plugin(SOP)
- Enterprise JavaBeans(EJB)的 Deployment descriptor(DD)扩展
我们也强调这四个选项的利弊。
在业务流程模型中编辑 KPI
如该系列文章的第 3 部分中阐述的,分析员使用 Business Integration Modeler 来编辑业务流程的 KPI。
图 1. 在 WebSphere Business Integration Modeler 中指定 KPI
例如,图 1 展示了 KPI“每小时接收到的定制的数量”及相应的观察点(例如,图中我们选择了输入标准和输出标准作为观察点)。观察点是流程(任务、子流程、变量及循环)中的一些位置,在此需要测量以使 KPI 生效。该指定的 KPI 与流程模型中的“定制流程子系统”任务相关联。此 KPI 文档帮助您在开发环境中创建适当的构件。表 1 展示了分析员为 OTMPS 场景指定的 KPI、它们的描述以及流程模型中相应的观察点。
表 1. KPI 及流程模型中的观察点
|
KPI
|
描述
|
观察点及流程模型中相关的元素
| |
定制吞吐量
|
每小时由 OTMPS 流程处理的定制的总数=处理的定制的数目/(流程终止时间-流程起始时间)
|
- 流程输入(OrderProcessSystem 流程)
- 流程输出(OrderProcessSystem 流程)
- 处理的定制数目(变量)
| |
成功率
|
成功结束的流程实例的数目/流程实例的总数
|
- 流程输出(OrderProcessSystem 流程)
| |
无效定制的数目
|
确认之后的无效定制的数目
|
- 无效定制的数目(变量)
| |
故障排除的时间
|
ExceptionHandler 流程所需时间=流程终止时间-流程起始时间
|
- 流程输入(ExceptionHandler 流程)
- 流程输出(ExceptionHandler 流程)
|
在后面的部分中,我们将向您展示如何使用可用的事件创建工具及 Business Integration Server 来将这些观察点转换成可执行的工作流代码。这些在 Business Integration Modeler 中指定的 KPI 用于监控由工作流代码生成的事件的业务性能。该系列文章的第 8 部分将描述如何使用这些 KPI 规范来创建对象模型,以获取所需的规格。
创建事件
Business Integration
Modeler 可以以 BPEL 的形式输出业务流程模型,随后将其引入到 Business Integration Server 中来创建可执行的工作流(请见该系列文章的第 4 部分)。对于 Business Integration Modeler 中编辑的 KPI 和观察点,您必须添加一些代码或者配置已生成的工作流在适当的位置创建所需的事件。在本部分中,我们简要地描述了 Common Base Event(CBE)模型及 Common Event Infrastructure(CEI)。我们也探讨了创建事件的不同方法,并向您展示了如何创建 OTMPS KPI 相应的事件。
通用基础事件模型
通用基础事件(Common Base Event,CBE)模型是一种标准,由 IBM
Autonomic Computing Architecture Board 开发,以 XML 格式定义了通用的事件表示。对于 CBE 模型 V1.0.1 的详细讨论请参阅参考资料部分中的“使用通用基础事件模型将消息标准化”。
公共事件基础架构
公共事件基础架构(Common Event Infrastructure,CEI)是一套模块化的组件,提供了对于事件的创建、传播、持续和消耗的支持。使用 CBE 模型来表示这些事件。目前,CEI 支持上文描述的 CBE 模型的 V1.0.1。
在 Business Integration Server 中 CEI 是可用的。在 Business Integration Server Foundation 中,CEI 提供了下列工具(请参见参考资料部分中的 Business Integration Server Foundation Information Center——“使用公共事件基础架构”):
- 运行时的环境。CEI 提供了用于传播、持续、查询及分发时间的运行时的环境。该环境由两个 J2EE 应用程序组成——event-application.ear 和 event-message.ear。在其它应用程序使用 CEI 之前需要将这些应用程序成功地部署好。
- 管理环境。管理员可以配置 CEI 运行时的环境。通过使用管理控制台,管理员可以启动并终止 CEI 服务、启动并终止 Application Events Service、创建并更新 Emitter Factory Profiles 以及创建并更新 Event Groups。
- 事件浏览器。CEI 包含事件浏览器应用程序——CBEViewer.ear 文件,它可被用于观察 CEI 存储的事件。
使用 CEI 来发出事件
CEI 提供了用于 WebSphere 应用程序的标准接口及服务来创建并发出事件对象。
该任务的步骤(对于每步的详细信息请参见参考资料部分中的“使用公共事件基础架构中的通用基础事件”和“使用 WebSphere Event Programming Model 发出事件”):
- 创建事件——使用事件工厂来创建 CBE。
- 添加数据(可选)——将 ExtendedDataElement 添加到事件中。
- 添加上下文(可选)——将 ContextDataElement 添加到事件中。
- 获取发射器——从发射器工厂中获取发射器。
- 发送事件——使用发射器来发送事件。
- 释放发射器资源——关闭发射器。
CBE 有一些强制属性,例如,version(字符串属性)、creationTime(dateTime 属性)、sourceComponentId(ComponentIdentification 元素)和Situation(Situation 元素)。Business Integration Server 提供了内容处理器,它可以自动地填写这些事件属性。该内容处理器与 Business Integration Server 提供的默认的事件工厂相关联。换句话说,Business Integration Server 自动地将系统指定的信息添加到使用默认的事件工厂创建的事件中。应用程序也可以定义应用程序指定的内容处理器并将其与事件工厂相关联。然而,仅有一个内容处理器可以与事件工厂相关联。一个工作是使用工具类来担当 CEI 的顶层外观并且在调用 sendEvent() 之前将应用程序特定的信息(例如,应用程序名称)添加到事件中,sendEvent() 调用了内容处理器。Business Integration Server 内容处理器没有重写应用程序添加的信息。
清单 1 展示了某一工具类的样例代码,清单 2 从 BPEL 工作流的 Java 片断中展示了它的用法。完整的代码可以从下载部分中获得(单击本文上方或底部的代码图标来下载代码样例)。
清单 1. CEI EventHandler 工具类
public class EventHandler {
private static String emitterFactoryLookup =
"com/ibm/events/configuration/emitter/Default";
private static String eventFactoryLookup =
"com/ibm/websphere/events/factory";
private static String property1 = "NumberOfOrders";
public static EventHandler eINSTANCE = new EventHandler();
private EventHandler() {
// Get an EmitterFactory
// Get an emitter from the EmitterFactory
// Get an EventFactory
}
public void sendEvent (String eventName, String msg, Object data,
String context) {
try {
// create CBE using event factory
CommonBaseEvent event =
eventFactory.createCommonBaseEvent(eventName);
// add application specific information to event
if (data != null) {
Order [] orders = (Order [])data;
event.addExtendedDataElement(property1,
String.valueOf(orders.length));
}
if (context !=null) {
event.addContextDataElementWithValue("string",
"OTMPS Process", context);
}
event.setMsg(msg);
ComponentIdentification sourceComponentId =
eventFactory.createComponentIdentification();
sourceComponentId.setComponentIdType(ComponentIdentification.COMP
ONENT_ID_TYPE_APPLICATION);
sourceComponentId.setApplication("OTMPS");
event.setSourceComponentId(sourceComponentId);
// send event using emitter
emitter.sendEvent(event, SynchronizationMode.DEFAULT,
TransactionMode.NEW);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
|
清单 2. 使用 CEI EventHandler 发出事件
EventHandler.eINSTANCE.sendEvent("OTMPSStartEvent", "OTMPS started by "+userName,
orders, this.activityInstance().getProcessInstanceID().toString());
|
使用 ECS 来发出事件
Business Integration Server 具备扩展的 CEI,它通过加入 Event Correlation Sphere(ECS)外观而实现,该外观通过 ECSEmitter 类提供了对 CEI 的访问。与 CEI API 相比,使用 ECSEmitter 的优点是它保存了事件的上下文。ECSEmitter 自动地将两个上下文元素——当前及父上下文——添加到事件中,通过使用发射器来发送该事件。例如,如果子流程发出事件,然后当前的上下文引用了子流程实例,并且父上下文引用了主流程实例(详细信息请参见参考资料部分中的“信息中心——使用 ECSEmitter 类创建并组装事件”)。ECSEmitter 也提供 API 来创建数据事件。数据事件被用于发出额外的数据信息。例如,OTMPSStartEvent 表示起始情况,而 OrderDataEvent 没有指出任何情况仅用于发出由 OTMPS 处理的定制数据。
使用 ECSEmitter 发出事件的步骤(每步的详细信息请参见参考资料部分中的“信息中心——使用 ECSEmitter 类创建并组装事件”):
- 创建 ECSEmitter——通过指定所用的事件工厂及新的上下文标识符(可选)来创建 ECSEmitter 实例。
- 创建事件——使用 ECSEmitter 来创建 CBE。
- 添加数据(可选)——将 ExtendedDataElement 添加到事件中。
- 创建数据事件(可选)——使用 ECSEmitter 来创建数据事件。
- 发送事件——使用 ECS 发射器发送事件。
- 释放发射器资源——关闭发射器。
ECSEmitter 使发出及关联事件变得非常容易,但是它不能选定我们先前讨论的单一的 CEI 内容处理器限定。因此,如果您想将应用程序的特定信息添加到事件中那么仍旧需要工具类。清单 3 展示了用于 ECS 的工具类。在这种情况下,我们没有指定用于 ECSEmitter 的新的上下文标识符,因为当流程启动时 Business Integration Server 自动地设置业务流程的当前及父上下文标识符。
清单 3. ECS EventHandler 工具类
public class EventHandler {
private static String emitterFactoryLookup =
"com/ibm/events/configuration/emitter/Default";
private static String eventFactoryLookup =
"com/ibm/websphere/events/factory";
private static String property1 = "NumberOfOrders";
public static EventHandler eINSTANCE = new EventHandler();
public void sendEvent (ECSEmitter emitter, String eventName,
String msg, Object data) {
CommonBaseEvent event = null;
try {
// create a new ECS emitter
ECSEmitter emitter = new
ECSEmitter(emitterFactoryLookup, null);
// create a CBE using ECS emitter
event = emitter.createCommonBaseEvent(eventName);
// add application specific information to event
// send event using ECS emitter
emitter.sendEvent(event, SynchronizationMode.DEFAULT,
TransactionMode.NEW);
} catch(Exception ex) {
ex.printStackTrace();
}
}
public void sendDataEvent (Object contextData) {
try {
// create a new ECS emitter
ECSEmitter emitter = new
ECSEmitter(emitterFactoryLookup, null);
// create and send data event using ECS emitter
if (contextData != null) {
Order [] orders = (Order [])contextData;
Properties properties = new Properties();
properties.setProperty(property1,
String.valueOf(orders.length));
emitter.addUserDataEvent(properties);
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
|
使用 SOP 来发出事件
由 Business Integration Server 提供的 State Observer Plugin(SOP)自动地发出适当的与流程相对应的事件、活动、变量等等,在 BPEL 中它们被标记成“BusinessRelevant”。例如,如果流程被标记成“BusinessRelevant”,如图 2 所示,那么 SOP 将生成两个 ProcessInstance 事件,一个用于 StartSituation,另一个用于 StopSituation(请见参考资料部分中的“信息中心——使用通用基础事件来监控业务流程”)。
图 2. 具备 Business Relevant Flag 的 Business Integration Server 中的工作流程
此解决方案是非常易于使用的,希望将其完好地整合进业务性能监控工具中。然而,不允许应用程序直接将数据添加到事件中。它为变量生成了独立的事件。需要用事件的相互关联来查找活动或流程相对应的数据。
图 3. 通过 BPEL 流程生成的事件
图 3 展示了可以由 BPEL 流程生成的所有事件。表 2 展示了这些事件的一些详细信息。由 SOP 生成的事件具有不同的类型,例如,WPC:ProcessinstanceEvent、WPC:ActivityinstanceEvent 和 WPC:VariableEvent。不同的情况将这些事件被分成了更多的种类,例如,WPC:ProcessinstanceEvent 可被用于启动、终止、销毁或失败的情况。同样的情况也可以表示不同的条件,例如,终止情况可以表示成功或不成功的完成。
事件数据表示唯一的类型、情况和条件的组合。SOP 生成的事件实质上是通用的。查询及关联这些事件是困难的。您必须通过查看
extendDataElements 或 contextDataElements 来区分事件。例如,为了查找流程创建的特殊事件,您必须查看
ExtendedDataElement“processTemplateName”。为了增加复杂性,一些 extendedDataElements 仅对向流程或活动发出的第一个事件才可用。例如,ExtendedDataElement“processTemplateName”仅启动事件可用,并且您必须使用 contextDataElements 来查找相应的终止事件。SOP 的另一限制是使用 toString() 函数将变量序列化,因此缺省情况下它不能用于复合变量。
表 2. 流程策划器发送的事件
|
代码
|
对象
|
状态
|
ECSCurrentID
|
ECSParentID
|
描述
| |
21000
|
流程
|
启动
|
ProcessInstanceID
|
没有指定
|
流程启动
| |
21004
|
流程
|
终止
|
ProcessInstanceID
|
没有指定
|
流程完成
| |
21005
|
流程
|
终止
|
ProcessInstanceID
|
没有指定
|
流程终止
| |
42001
|
流程
|
故障
|
ProcessInstanceID
|
没有指定
|
流程发生故障
| |
21020
|
流程
|
销毁
|
ProcessInstanceID
|
没有指定
|
流程被删除
| |
21006
|
活动
|
启动
|
ActivityInstanceID
|
ProcessInstanceID
|
活动准备好
| |
21007
|
活动
|
启动
|
ActivityInstanceID
|
ProcessInstanceID
|
活动启动
| |
21011
|
活动
|
终止
|
ActivityInstanceID
|
ProcessInstanceID
|
活动完成
| |
21090
|
变量
|
报告
|
ProcessInstanceID
|
没有指定
|
变量更新
|
使用 DD 扩展名来发出事件
Business Integration Server 通过使用 Deployment
Descriptor(DD)扩展名提供了一种创建与 EJB 方法的启动及结束相对应的事件的方法。例如,如图 4 所示,OrderProcessSystemBean 的 sendOrderProcessSystem_InputCriteria 方法用于在调用该方法之前生成事件。关于如何设置企业 bean 的通用基础事件部署的属性的详细信息请参见参考资料部分中的“信息中心——设置 EJB 模块的通用基础事件部署的属性”。
图 4. 用于生成 CBE 的 EJB 配置向导
此解决方案对于获取 EJB 相关的事件是非常有用的。然而,对于由 EJB 代码生成的业务流程而言,确定适当的方法是困难的。同时,当每次生成用于 BPEL 的部署代码时都会重写这些部署描述符。
表 3 总结了每种解决方案的优点及缺点。
表 3. 比较发出事件的不同解决方案
|
解决方案
|
优点
|
缺点
| |
CEI API
|
|
-
需要编码
-
事件结构被嵌入代码中
-
需要应用程序来维护并添加事件的上下文
| |
ECS API
|
-
自动地将上下文添加到事件中,使得关联事件变得非常容易
|
| |
用于 BPEL 的 SOP+扩展名
|
- 非常易于使用
- 由 BPEL 来获取事件
- 可以与今后的监控工具很好地结合
|
-
查询困难
-
默认情况下不能用于复合变量
-
不允许应用程序直接将数据添加到事件中
| |
用于 EJB 的 DD 扩展名
|
-
易于使用
-
可以将方法参数添加到事件中
-
部署描述符获取事件结构
|
-
仅被用于创建 EJB 方法的起始及终止事件
-
不能与 BPEL 一同使用
|
发出 OTMPS 的事件
我们决定使用 SOP 来发出事件。主要原因是 SOP 生成的事件被认为能够很好地同今后的监控工具相结合。此外,我们无需创建用于复合变量的数据事件,并且,我们认为,使用 SOP 的优点在于需要将变量事件同流程及活动事件相关联。对于如何将 SOP 生成的事件相关联的详细信息,请注意该系列文章的第 8 部分。
如图 2 所示,我们将下列 BPEL 流程及变量标记成“BusinessRelevant”。
- OrderProcessSystem
- OrderProcessSystem 流程
- numberOfOrders 变量
- numberOfInvalidOrders 变量
- ExceptionHandler
(关于不同流程的详细信息请见该系列文章的第 5 部分。)
致谢
作者感谢 Eric D. Wayne、German Goldszmidt 博士、Wilfred C. Jamison 和 Tai W. Nam 给本文提出的意见。
结束语
本文中,作者向您展示了发出事件可选择的不同方法,结论是:虽然关联 State Observer Plugin(SOP)生成的事件很困难,但这仍旧是使用 WebSphere Business Integration Modeler V5.1 建模的业务流程所用的最好的解决方案。然而,标记成“BusinessRelevant”的变量必须是简单数据类型。在下一篇文章中,作者将论述如何接收事件并将它们相关联。作者将说明如何使用本文中编辑的 KPI 规范来创建对象模型以获取所需的规格。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Sample code for CEI EventHandler utility class | ws-odbp7code.zip | 2 KB | HTTP |
|---|
参考资料
作者简介  | |  | Naveen Sachdeva 是 IBM Application Integration Middleware 开发组中的咨询软件工程师。他在大规模系统集成以及设计和开发分布式操作系统方面有 10 多年的经验。他目前正在使用 WebSphere Studio 系列产品向 IBM 的业务伙伴提供技术支持以及概念检验。 |
 | |  | Joshy Joseph 是 IBM 软件组随需应变体系结构和开发组织的一位软件工程师。作为一名架构师和程序员,他的主要技能和专长包括分布式计算、网格计算、Web 服务、业务流程以及和工作流开发等领域。2003 年他的专著
网格计算
由 Prentice Hall 出版社出版。另外,他还撰写了大量的关于网格计算、业务流程开发以及 Web 服务方面的文章。 |
对本文的评价
|