构建 SOA 组合业务服务,第 4 部分: 使用公共事件基础设施开发可测量的组合应用程序

 

引言

WebSphere® Integration Developer 和 WebSphere Process Server 将公共事件基础设施(Common Event Infrastructure,CEI)作为提供基本事件管理服务的方法引入。CEI 按照 CBE 规范的定义处理公共基础事件(Common Base Event,CBE)。CEI 提供基于标准 XML 的事件格式,从而支持采用通用机制来记录和查询事件。在 WebSphere Integration Developer 内置 CEI 支持,可生成 CBE 事件。例如,可以选择业务流程执行语言(Business Process Execution Language,BPEL)活动,并随后选择一个活动开始或活动停止事件,而这将自动生成 CBE。不过,您可能需要生成与 WebSphere Integration Developer 事件不对应的业务级别事件。可以使用业务流程引擎(Business Process Engine,BPE)API 进行此工作。不过,由于此 API 公开 CBE 格式以及其他 CEI 特定的属性,API 相关的部分包含在一个很方便使用的构件集中,此构件集支持对事件进行日志记录、查询和查看。本文将对这些构件进行说明,并将介绍如何在组合应用程序中使用它们。

捕获业务级别事件

为了对组合应用程序进行测量,您需要捕获业务级别事件。业务级别事件是捕获与业务相关的信息的事件。例如,当银行资金从一个账户转帐到另一个账户时,会记录一个事件。业务级别事件可帮助我们理解和改进企业开展业务的方式。记录了业务事件后,可以对其进行聚合,以确定业务趋势,从而反过来提供所需的测量结果来提高业务。不过,业务级别事件并不一定与任何具体 WebSphere Integration Developer 活动相关。WebSphere Integration 活动可以与一系列 WebSphere Integration Developer 步骤相对应。图 2 显示了一些典型的 WebSphere Integration Developer 活动。业务级别的事件可以与一系列 WebSphere Integration Developer 活动相对应。

完全可测量的另一个要求是,能够在事件中保存任意数据。此任意数据在业务级别具有意义。CBE 规范支持使用 CBE 的 ExtendedDataElement 部分来保存任意数据。此部分将应用程序特定的数据格式化为一组名称-值对。

生成 CBE 事件

每种可监视组件类型(如业务流程、业务规则等等)都具有一组在 WebSphere Integration Developer 中预先定义的业务事件(请参见表 1)。不过,有时候这些预定义的事件并不提供生成业务级别事件所需的灵活性。因此,为了给组合应用程序提供完全可测量的能力,需要随时生成业务级别事件。


表 1. 每个编辑器的可监视元素

编辑器可监视元素
Assembly editor(仅 CEI)Operation
Business process editor(CEI 和 Audit Log)Assign、 Compensate、Empty、Flow(并行活动)、Invoke、Pick(接收选择)、Process、Receive、Reply、 Rethrow、Scope、Script、Sequence、Staff、Switch(选择)、Template(未显示)、Terminate、 Throw、Variable、Wait、While(While 循环)
Business object-mapping editor(仅 CEI)Map、Transformation(所有类型)
Business rule-group editor(仅 CEI)Operation
Business state machine editor(仅 CEI)Action、Entry、Exit、Guard、State、State Machine Definition(状态机)、Timer、Transition
Human task editor(CEI 和审核日志)Escalation、Task、Task Template(未显示)
Interface-mapping editor(仅 CEI)Operation Binding、Parameter mediation(所有类型)
Selector editor(仅 CEI)Operation

注意:在表 1 中,标识为审核日志 事件是在流程编排器数据库中作为审核事件生成的。标识为 CEI 的事件是在 CEI 数据存储库中生成的。


表 2. 活动及其关联的缺省事件

活动缺省事件名
InvokeCompletion forced、Entry、Exit、Expired、Failed、Retry forced、Skipped、Stopped、Terminated
ProcessCompensated、 Compensating、Compensation failed、Correlation、Deleted、Entry、Event handler escalated、Event received、Exit、Failed、Failing、Restarted、Resumed、Suspended、Terminated、 Terminating、Work item created、Work item deleted、Work item transferred
ReceiveEntry、Exit、Terminated
ReplyExit、Failed、Skipped
ScopeCompensated、Compensating、Compensation failed、Entry、Event handler escalated、Event received、Exit、Failed、Failing、Skipped、Terminated
StaffAssigned、 Completion forced、Created、Deassigned、Escalated、Exit、Expired、Failed、Fault set、Output set、Retry forced、Skipped、Stopped、Terminated、Work item created、Work item deleted、Work item refreshed、Work item transferred
Template(未显示)Deleted、Entry

查看 CBE

有两个选项可用于检索和分析 CBE。

  • WebSphere Process Server 提供的 CBE Event Browser 提供了 CBE 的简单视图,可在 WebSphere Integration Developer 中从服务器视图启动,或在浏览器中使用以下地址启动:http://localhost:9060/ibm/console/cbebrowser。此选项可供希望查看生成的事件的开发人员使用(请参见图 1)。
  • 可以使用程序检索事件,并执行自定义分析和表示。本文提供的构件就是采用此选项。


图 1. CBE Event Browser
CBE Event Browser

使用可重用 CEI 构件

为了处理业务级别事件,请参见下载部分,其中提供了三个通用构件。业务级别事件可以使用 CEIEventEmitter 发出,使用 CEIQueryService 进行查询或使用 CEIMeteringViewPortlet 进行查看。

使用 CEIEventEmitter

CEIEventEmitter(请参见图 2)允许我们从 Java™ 代码片段或从业务流程调用的服务组件体系结构(Service Component Architecture,SCA)组件生成业务级别事件。此事件可以与业务级别事件相关,可以包含任意名称-值对集。


图 2. CEIEventEmitter 的类关系图
CEIEventEmitter 的类关系图

从 Java 代码发出事件

清单 1 显示了从 Java 代码发出业务级别事件的示例。可以使用工厂模式来创建事件发射器,并随后使用恰当的数据来调用它。可以生成日志事件 (emitLogMessage) 或标准事件 (emitEvent),前者中包含一个简单消息,而后者包含 eventName、eventTrackingId 和一组名称-值对(其中包含事件的数据)。


清单 1. Java 代码片段

ICEIEventEmitter eventEmitter  =  CEIEventManagementFactory.createEventEmitter();
eventEmitter.emitLogMessage(String application, String eventTrackingId, String message);
eventEmitter.emitEvent(String application, String eventTrackingId, String event,
                       String[] eventDataName, String[] eventDataValue)
                       
throws  CEIEventException;

eventTrackingId 对所有相关数据进行关联。例如,可以为一个业务流程使用相同的 eventTrackingId。事件是字符串,表示已发生的业务级别事件。可以使用冒号来创建具有语义含义的事件名称,如 WPS:BusinessLevelEvent:FundTransferEvent

清单 2 是在银行应用程序中使用的示例代码片段,用于记录转帐期间的业务级别事件。


清单 2. 使用 CEIEventEmitter 的银行应用程序示例

//  Bean implementation class for Enterprise Bean: AccountTransferService
public   class  AccountTransferServiceBean  implements  javax.ejb.SessionBean  {
  
//some code is ignored here
  public void makeTransfer( String bankId, String fromAccId, String toAccId,
                            BigDecimal amount, String description)
                             
throws EJBException, TransferException {
    
// some code is ignored here
    try {
      fromTransaction 
= transactionsLocalHome.create(time.toString(),
                                                   fromAccId,fromBankId,
"Transfer",time);
      fromTransaction.setDescription(description);
      fromTransaction.setTotal(amount);
      fromTransaction.setToaccid(toAccId);
    }
 catch (CreateException e2) {  e2.printStackTrace();} 
        
    meterDebitEvent(fromBankId,fromAccount.getCustomerid(),fromAccId,amount);
    meterCreditEvent(toBankId,toAccount.getCustomerid(),toAccId,amount);
  }


  
private void meterDebitEvent( String bankId,String userId,String fromAcc,
                                BigDecimal amount) 
{
    
try {
      ICEIEventEmitter emitter 
= CEIEventManagementFactory.createEventEmitter();
      emitter.emitEvent(
"Jivaro""Jivaro""transfer_funds"new String[] {
                        
"OpCode""AgentID""BfsID""SubscriberID""UserID",
                        
"HostName", STATIC_Metering_ACTID, STATIC_Metering_AMOUNT}
,
                        
new String[] {  STATIC_Metering_DEBIT_OPCODE,
                        STATIC_Metering_AGENTID, STATIC_Metering_BFSID, bankId, userId,
                        java.net.InetAddress.getLocalHost().getHostName().toString(),
                        fromAcc, amount.toString()}
);
    }
 catch(Exception e)  { e.printStackTrace(); }
  }


  
private void meterCreditEvent(String bankId,String userId,String toAcc,
                                BigDecimal amount) 
{
  }

  
// some code is ignored here
}

从 SCA 组件发出事件

CEIEventEmitterRouter (在可下载构件中)将 CEIEventEmitter 包装为 Web 服务。可以随后将此 Web 服务导入到 WebSphere Integration Developer 中,并将调用 SCA 组件与其连接(请参见图 3),从而支持将 CEIEventEmitter 作为服务调用。如果性能是要加以考虑的问题,则可以将构件包含在 SCA 模块中,并将其作为标准 Java Bean 进行调用。


图 3. 将 CEIEventEmitter 作为服务
将 CEIEventEmitter 作为服务

使用 CEIQueryService

CEIQueryService(请参见图 4)允许您查询 CEI 持久状态,并返回指定相关范围内的 CBE 的数据。相关范围将所有相关 CBE 分组到一起。

当 CEIEventEmitter 保存事件时,trackingId 将形成相关范围,以用于对相关事件进行关联。可以检索所有相关 CBE 事件。此构件的该接口是一个 Web 服务,事件以传统 Java 对象(Plain Old Java Object,POJO)的形式返回(而不是 CBE),以方便访问。

此构件包含两个部分。第一部分是实际的 Web 服务及其相关构件,包含在 EAR 文件 CEIQueryServiceEAR 中。这些构件部署在 WebSphere Process Server 实例上。CEIQueryService 构件的第二部分是 Web 服务的客户机接口及其相关的代理类。此部分包含在 EAR 文件 CEIQueryServiceClientEAR 中。客户机接口是一个 EAR 文件,以方便访问 WAR 来进行测试。客户机项目提供 WebService 代理和所需的类,以对 CEIQueryService 调用操作。通常是通过实例化 CEIQueryServiceProxy 并随后对 Web 服务调用所需的操作来启动 Web 服务的。将在 CEIQueryEvent 对象中返回数据,其中包含一个 CEIQueryEventData 对象数组。


图 4. CEIQueryService 类关系图
CEIQueryService 类关系图

CEIQueryServiceClientWeb/WebContent/sampleCEIQueryServiceProxy 中提供了一些示例,可说明如何调用 CEIQueryWebService。通过了解这些示例,可以使用生成的代理来测试 Web 服务。选择 TestClient.jsp,然后选择 Run > Run on Server。将随即打开 Web 浏览器,可以在其中选择要运行的操作。请记住,如果服务部署在远程主机上,则要更改端点。

注意:为了成功编译所有项目,请确保 WPS_RUNTIME/CEI/client/events-client.jar 文件位于项目构建路径中。WPS_RUNTIME 是 WebSphere Process Server 的安装目录,如 C:/Program Files/IBM/Rational/SDP/6.0/runtimes/bi_v6。

使用 CEIMeteringViewPortlet

CEIMeteringViewPortlet(请参见图 5)是一个 Portlet,可通过其查看使用 CEIEventEmitter 创建的测定事件。CEIMeteringPortlet 使用 CEIQueryService 检索事件,并随后在 Porlet 页面将其列出(请参见图 6)。此 Portlet 允许用户根据日期、代理或订阅者筛选事件。


表 3. 字段描述

标准名称用途
Start date不显示此日期前生成的事件。
End date不显示此日期后生成的事件。
Agent显示此代理生成的事件。代理是标识事件源的字符串。可以为应用程序选择用于发送事件的任意字符串。它与 CBE 的 sourceComponentId/@application 属性对应。
Subscriber将显示此订阅者订阅的事件。订阅者是标识事件源选择的字符串。它标识此事件的相关方。它与带名称 SubscriberID 的 CBE 的 ExtendedDataElement 相对应。

筛选标准字段是可选的。此 Portlet 仅使用可用标准来筛选事件。此功能对于有很多事件的情况尤为有用。

此 Portlet 的功能之一是能够使用 XPATH 查询字符串进行筛选。CEIMeteringPortlet 从用户指定的标准构造 XPATH 查询字符串,并将此查询字符串发送到 CEIQueryService。CEIQueryService 随后接受 XPATH 查询字符串,并检索事件(筛选出不符合标准的事件)。


图 5. CEIMeteringViewPortlet 的类关系图
CEIMeteringViewPortlet 的类关系图

图 6. CEIMeteringViewPortlet 摘要视图
CEIMeteringViewPortlet 摘要视图

可以选择事件以查看其详细属性(请参见图 7)。


图 7. CEIMeteringPortlet 细节视图
CEIMeteringViewPortlet 细节视图

结束语

本文说明了为什么实现组合应用程序可测量性非常重要。其中对业务级别事件的角色进行了说明,并提供了三个构件,可将其用于在组合应用程序的上下文中生成、查询和查看业务级别事件。在这些可重用构件的帮助下,可使您的组合应用程序具有可测量性,从而为改进整个业务流程打下基础。

下载

描述名字大小下载方法
Assets projects in server side for this article1assetsserviceside.zip117KBHTTP
Assets projects in client side for this articleassetsportlet.zip2832KBHTTP
List of all projects in above downloadable filesprojectlist.zip6KBHTTP
关于下载方法的信息

Note

  1. 构件以项目交换格式提供。为了导入构件,只需选择 File>Import,然后选择 Project Interchange 即可。



参考资料

学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值