分类:
2008-12-21 01:09:59
2006 年 5 月 31 日
SCA(Service Component Architecture),即服务组件架构,是最新发布的组件集成架构,SCA体现的是一种利用通用组件定义方式来集成分散商业功能的思想,SCA的出现,为企业系统集成带来了新的方法和标准,实质上SCA即将成为SOA系统的基本构建方式,同时SCA也是新发布的WPS(WebSphere Process Server)中的最重要的技术基础架构。许多SOA开发人员以及系统管理人员对于SCA模块及其组件的运行监控和调试还不是很熟悉,在本文中,作者将向大家简单介绍如何配置和使用CEI(Common Event Infrastructure)在WPS中监控SCA组件的运行情况。
本文将主要介绍以下几个方面的内容:
1, 什么是CEI和CBE;
2, 如何为SCA组件激活和配置CEI事件监视器;
3, 如何在WPS中配置CEI来监控SCA组件的运行情况;
4, 如何利用CEI提供的API来实现灵活定制的事件管理;
CEI (Common Event Infrastructure)本质上是一种用来封装应用程序中产生事件的通用机制。整个CEI的框架是基于EMF(Eclipse Modeling Framework)之上构建起来的,因此我们也可以看到CEI的底层实现是基于MDA/MDD来构建的。CEI也为开发人员提供了一套完备的API来生成和发布事件,另外也提供了客户端的API来帮助开发人员便利地检索已经记录下来的事件。在CEI的框架中是通过中央的CEI服务器来完成事件捕获和分发任务的。CEI是 SOA 核心的一部分,我们可以使用 CEI 捕获用于监视应用程序的事件(如在 IBM WebSphere Business Monitor 或Tivoli 产品中)。CEI 是WebSphere Process Server 的重要组成部分,并通过它为每一个 SCA 服务组件生成一组特定的事件。图 1 是WPS的框架图,我们可以看到CEI是SOA底层的核心组成部分。
CEI的整体架构示意图如 图 2 所示:
CEI服务器是CEI架构的核心部分,主要完成了以下几个功能:
CBE(Common Base Events)即公共基本事件是一些复杂的EMF对象。CBE模型是一种标准,用来定义将由企业管理和业务应用程序使用的事件的公共说明。此标准由 IBM 自治计算体系结构委员会开发,支持对记录、跟踪、管理和使用基于公共 XML 格式的业务事件进行编码,并使得不同应用程序生成的不同类型的事件之间可以相互关联。
CBE事件体中的事件负载(Payload)是一种被扩展了的数据元素,所有事件的具体内容都包含在事件负载中,具体事件的内容和结构取决于事件本身。在SCA模块中,所有的组件都可以被配置成生成三种不同的事件负载模式:
如果我们想要利用CEI来监控SCA组件的运行情况,我们就需要为相应的SCA组件激活CEI的事件监控功能。这里有两种方式可以利用:
在SCA应用模块中的所有的调用都可以被CEI监控,所有的SCA组件都可以被配置(动态或者静态)成相应的CEI事件源。不同组件可以生成的事件类型是不尽相同的,但是对于基本的事件类型,如Entry,Exit和Failure,每种SCA组件是都可以生成这些事件的。
我们可以通过WID (WebSphere Integration Developer)中的集成编辑器(Assembly Editor)来为不同的SCA组件配置CEI参数。如图 4 所示,在我们选中了某一个SCA组件之后,可以在WID中的Properties > Event Monitor视图中来配置相应的CEI参数。我们可以选择不同的配置方案,比如只捕捉SCA组件的Entry事件。另外在这个视图中我们也可以选择所捕捉事件的类型(full payload,digest payload和empty payload)以及所选用的Transaction类型。
静态配置方式范例: BPEL流程
在图 5 中我们可以看到,即使Invoke和Receive都是BPEL流程中的元素,它们所拥有的CEI事件配置也是不尽相同的。
我们可以通过WPS中的管理控制台来动态的为SCA组件激活CEI配置。在WPS的管理控制台中选择Troubleshooting > Logs and Trace > server > Change Log Level Details,然后选择runtime页,然后就可以动态的配置不同的组件。所有的组件必须已经至少运行过一次才能出现在这个视图中,如果我们已经知道确切的组件名字,我们可以在这个配置视图下方的trace定义栏里来配置我们所需要的组件。
动态配置方式中的一些选项:
在 图6 中我们可以看到,有两组不同的组件配置定义方式,一组是以CEI作为前缀的,一组是以LOG作为前缀的。以CEI作前缀的组会将生成的事件发送到CEI事件服务器上,而以LOG作前缀的组会将生成的事件发送到WAS的LOG记录器上。
在WPS的管理控制台来配置CEI主要有以下两个需要配置的地方:
下面简要介绍了一些比较重要的配置点:
事件服务器(Event Server)配置:
通过Common Event Infrastructure Provider>Event Server Profile页面来开启或者关闭事件分发的功能;开启或者关闭事件持久化的功能;并可以配置事件服务器相应的事件数据存储源的信息。图 8 显示了WPS管理控制台中Event Server配置视图。
事件组(Event Groups)配置
:
通过事件组的配置,我们可以将事件划分到不同的分组当中,所有属于某一个事件组的事件都会被一起分发到相应的事件消费者那里。我们可以定义PUB/SUB或者P-to-P的事件发布模式。
事件发射器(Emitters)和发射器工厂(Emitters Factory)配置:
事件发射器实质上是一些功能类的集合,通过这些功能类提供的功能,不同的事件源可以创建或者发布不同的事件。而这些事件发射器是通过事件发射器工厂得到的。通过对事件发射器工厂的配置,我们可以指定所生成的事件将会被发布到什么样的事件总线上去,是异步还是同步方式发布的,是不是以支持transaction的方式来发布事件。
事件传送(Transmission)配置:
CEI相关的事件传送有两种方式,第一种是利用事件总线(Event Bus)来同步的发布事件;第二种是利用JMS机制来异步的发布事件。CEI中的事件总线机制是由无状态的Session Bean来实现的,而异步的事件发布机制是由MDB(消息驱动Bean)来实现的。
J2EE相关资源的配置
BPEL流程和HTM(Human Task Management)容器的配置
对于BPEL和HTM的容器来说,CEI需要被显示的激活,否则在默认的情况下CEI在这些容器中是没有被激活的。在WPS的整体系统配置的架构中,这些容器的配置信息是整个WPS服务器配置信息的一部分。在WPS的管理控制台中,我们可以定位到Application Servers > server > Business Process Container Settings (或者 Human Task Container Settings)来显示地激活相应的CEI监控功能。如图 10 所示:
我们可以通过WPS管理控制台中的CBE浏览器(CBE Browser)(位于控制台中的Integration Applications > Common Base Event Browser页面中)来浏览和检索所有已经发布到CEI事件服务器上的事件。如图 11 所示:
不同类型的事件消费者:
针对CEI中的事件存在着两种不同的事件消费者,一类是"Pull"类型的事件消费者,另一类是事件的订阅者类型。对于"Pull"类型的事件消费者来说,他们通过主动查询事件数据库来得到所需要的事件信息;对于事件的订阅者来说,他们不会主动的去查询或者检索事件数据库,他们是依靠事件服务器所提供的"Push"事件的功能来将他们所订阅的事件发送给他们,可以说这是一种被动接受事件信息的方式。
CEI为开发人员提供了相应的API来支持这两种事件消费方式。CEI事件服务器通过无状态的Session Bean来支持第一种事件消费方式;通过JMS机制来发布事件到相应的事件订阅者来支持第二种事件消费方式。
在WPS中,CEI提供以下几类API:
a.创建事件API
WPS中的CEI提供两个产生事件的工厂,一个是通用事件工厂(org.eclipse.hyades.logging.events.cbe.EventFactory),另外一个是Webphere特定的事件工厂(com.ibm.websphere.cem.ECSEmitter)。前者由于需要用户自己处理事件的相关性, 所以在WPS环境中不推荐使用, 后者是集事件的创建,相关性,发送于一体的,创建事件的用法如列表1所示。
ECSEmitter 自动为事件添加一个parent id 和current id来处理事件的相关性,这样就会形成一个事件树。另外如果要往事件里面添加很多扩展数据,可以把一个java.util.Properties实例传给ECSEmitter,这样会自动根据Properties内容创建事件,并发送给CEI server,请参考列表2。
b.发送事件API
用户创建的事件是通过ECSEmitter类的API来发送给CEI server的,用法如列表3所示。此外事件的发送可以是同步的,也可以是异步的。
c.查询事件API
WPS中的CEI对外暴露出一个无状态的Session Bean, 通过这个bean用户可以查询符合给定条件的事件,用法见列表4。
EventAccess这个bean,提供了几个查询方法,可以传入不同的检索条件,对于样例里面的queryEventsByEventGroup方法,第一个参数是事件组的名子,第二个参数是事件选择器,选择条件是基于xpath的,例如CommonBaseEvent[@extensionName = ' WBI.JService.MethodInvocation.ENTRY '] 表示只选择扩展名为WBI.JService.MethodInvocation.ENTRY的事件, 构建event selector这个参数时请参看CBE定义文件。
d.事件分发API