使用公共事件基础设施开发可测量的组合应用程序

日期: 2008-08-04 作者:Javier GarciaQiang Wang 来源:TechTarget中国 英文

  本系列讨论如何开发组合应用程序来支持业务服务,本文是其中的第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 &#101xecution 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. 每个编辑器的可监视元素



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


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



  查看CBE


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


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



 


  图1. CBE Event Browser
 
  使用可重用CEI构件


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


  使用CEIEventEmitter


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



 


  图2. 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作为服务
 
  使用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类关系图
 
  CEIQueryServiceClientWebWebContentsampleCEIQueryServiceProxy中提供了一些示例,可说明如何调用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. 字段描述



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


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



  图5. CEIMeteringViewPortlet的类关系图




 
  图6. CEIMeteringViewPortlet摘要视图
 
  可以选择事件以查看其详细属性(请参见图7)。



  图7. CEIMeteringPortlet细节视图
 
  结束语


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


  作者简介


  Javier Garcia是一位拥有20多年开发经验的顾问软件工程师。他当前在SWG Strategy and Technology部门工作,工作重点是SOA和组合应用程序。
 
  DuoWei(David)Sun是IBM中国软件开发中心(CSDL)的一位高级软件工程师。他目前在从事SOA开发领域方面的工作。
 
  Zhi Gan是IBM中国软件开发中心的一位软件工程师。他从上海交通大学获得计算安全博士学位后即加入IBM。他在SOA、AOP和Eclipse方面具有广泛的经验。目前他的工作重点是使用模式进行模型驱动的开发。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 美国东海岸地震:DC基础施施老化受关注

    美国东海岸的地震,震撼了灾难恢复专家,更关心老化的基础设施可能会受到影响,比他们大公司如何准备他们的业务连续性计划。

  • 如何选择IaaS提供商?

    IaaS(基础设施即服务)市场尚不成熟,所提供的服务几乎都是唯一的,并且还在迅速地演进之中,因此必须小心地选择提供商。

  • 松散耦合的七个级别:数据模型和基础设施

    如果我们已经使用以上定义的所有松散耦合的等级,公司应该能使他们的服务实施、契约、策略和未破损的流程任意变化。然而,这不足以应付不断变化的业务需求。

  • 网格计算入门指南

    业务周期的速度和不可预测性已经使很多企业的管理能力逼近了极限。企业需要更具适应性,但他们信息系统的响应速度往往较慢。同时,这些企业希望借助IT系统获得更高的效率,并降低计算成本。

      网格计算是一种新的IT体系结构,它能够适应不断变化的业务需求。网格计算还为IT经济带来了革命性的变化。通过企业网格计算,您可以使用可随需应变的灵活成本结构构建一个功能强大的数据中心。

      虚拟化是关于运行时部署的效率,注重提供方便。因为企业逐渐转向应用SOA,所以它们会寻求服务周期的管理方式,这其中可能就包括调用虚拟容器作为服务、数据、甚至SOA基础设施本身(如虚拟化软件产品)的运行时间。