![]() | ||||
![]() |
![]() |
娄丽军 WBI Server Foundation是IBM WBI产品家族中的一个后起之秀,有越来越多的开发者早已开始学习和掌握这个产品,本文将分为两部分,第一部分是关于Server Foundation的基本概念和建模技巧,第二部分是关于动态建模和JMS接口。 第一部分,我们来学习和掌握一下Server Foundation的基本概念和建模技巧。 1.1 流程设计器体系结构 WBI Server Foundation 的运行环境提供一个高效的J2EE工作流引擎,它由流程导航(Navigator)、人员交互相关的工作项管理(WorkItem Management)、工厂(Factory)、内部和外部接口、客户端(Client)等部分组成。如下图: 导航器:导航器组件是流程引擎的核心,它管理所有流程实例的状态过渡以及这些流程实例中所有活动的状态过渡。 工作项管理:Work Item Manager 组件负责在流程引擎的数据库中创建和删除工作项,根据该数据库分析来自流程参与者的工作项查询等。 工厂:工厂组件负责管理流程引擎处理的"物理"状态信息,流程相关的数据能够以下列形式之一被存储:
它支持的数据库包括 DB2、Oracle、Sybase 和 Cloudscape。 外部接口:流程引擎对外提供EJB和JMS两种接口,由Fa?ade-Session EJB 和 Fa?ade MDB 负责外部接口的同步生成和异步生成。 客户端:Server Foundation提供了Web客户端支持,同时用户可以利用其API接口开发自己的客户端。 其他组件:流程引擎包含一个负责产生诊断信息的跟踪和记录组件。 1.2 业务流程语言 BPEL流程的要素包括: 1)合作伙伴连接(Partner Link): 在流程的执行过程中,流程本身和它的外部系统之间形成了调用和被调用的关系,通过定义合作伙伴连接来描述这种关系。合作伙伴连接描述了流程和外部系统之间的抽象服务接口,通过WSDL来定义。合作伙伴连接和一个合作伙伴连接类型(Partner Link Type)相关联,在合作伙伴连接中定义了每个流程参与方(Partner)的角色,合作伙伴连接类型中包含了这些角色实体的具体定义,包括端口类型(PortType),操作(Operation)和消息(Message)等。 2)活动(Activity):BPEL中的活动包括基本活动和结构活动两种。 其中基本活动是一些原子活动,主要包括:
而BPEL的结构活动包括:
利用以上两种操作可以实现流程的嵌套。我们可以创建一个流程序列,然后把它嵌套到大的流程中去,这样对于商业应用的的模块化设计以及代码的重用性都有非常重要的作用。
3)控制连接(Control Link):控制连接决定了流程内部活动的执行顺序,在Server Foundation中,可以通过 连接活动来指定。另一方面,也可以通过每个活动的Join Behavior属性来决定。 4)变量(Variable):变量定义了流程中的数据,它包含了流程相关的控制数据和状态数据。 5)相关关系集合(Correlation Set):当流程进行外部异步调用时,相关关系集合是将调用的响应和调用请求进行唯一性关联的手段。 6) 错误处理器(Fault Handler):在流程运行过程中,可能会发生各种错误,可以利用错误处理器来进行错误处理。在Server Foundation中,我们可以为单个活动、一组活动以及某个流程添加错误处理器,在错误处理器中描述出错时的具体处理步骤。 1.3 业务流程开发 1. 创建服务 2. 创建和设计流程 在进行WBI SF开发时我们主要利用前面讲到的BPEL基本元素来设计流程,IBM 提供了WSAD-IE(WebSphere Studio Application Developer Integration Edition)开发工具来进行流程的开发。如下图: 开发人员可以在WSAD-IE中完成所有流程的可视化定制以及J2EE1.3 API中规定的EJB、JSP、Web Service等的开发工作。 3. 测试和调试流程 4. 部署流程 ProcessEJB.jar (EJB 模块)--部署的 EJB、 生成EAR后,要把流程 EAR 部署到 WBI SF的运行环境中,部署时需要完成在服务器上安装流程 EAR应用程序、创建数据表和数据源、为用于本流程的 CMP EJB 创建后端映射等工作。完成流程部署工作之后,我们就可以启动并运行流程了。 2 建模技巧 A) 正确使用Microprocess (非中断) 和 Macroprocess (可中断)流程 我们知道,在ServerFoundation中流程的类型分为两种,一种是非中断流程,非中断流程的特点是:在一个事物环境或是没有事务中被执行,不能包含任何异步的或是有人为交互的操作;另一种是可中断流程,可中断流程由一组分层的事务组成,可中断的流程可以是一个人机交互的过程或者一个异步调用的过程。在执行速度上,非中断流程的执行速度是可中断流程的10倍以上。但是,对于必须有人工参与的流程以及存在异步调用的流程却不得不采用可中断流程,因此,在尽可能的情况下,可以将自动化的、同步调用的流程和有人工参与、异步调用的流程分离开来。在实际项目需求中,我们通常会需要流程中有人工参与的部分,在这种情况下,我们可以将其中自动化运行的、不可中断的部分分离出来,将其封装在一个非中断流程中,然后在另一个可中断流程中调用这个流程。 B) 采用Java Snippet和Assign Activity来实现数据映射 在Server Foundation中,有三种方式可以实现数据映射,其中包括利用Java Snippet, BPEL Assign活动和Transformer Service。它们的功能特点分别是:
在这三种实现手段中,我们建议采用Java Snippet和Assign Activity来实现数据映射。 C) 关于定制属性(Custom Properties)的灵活使用 在Server Foundation中,我们可以设置流程的定制属性,在流程执行过程中,可以通过API获得这些属性值,以供流程逻辑使用。定制属性的初始值是通过流程的Environment属性栏来设置的。当根据流程模版创建出流程实例时,这些属性值会赋予流程实例。在流程模版中,可以通过getProcessCustomProperty( )和 setProcessCustomProperty( )来存取定制属性,可以在Java Snippet活动中编写此代码。 通过BPE API调用时,可以通过BusinessProcess提供的getCustomProperty()和setCustomProperty( )方法来存取定制属性。 除了流程可以有定制属性之外,流程中的Activity也可以具有定制属性。在Java Snippet活动中可以通过getActivityCustomProperty( )和 setActivityCustomProperty( )来存取定制属性。通过BPE API调用时,同样可以通过BusinessProcess提供的getCustomProperty()和setCustomProperty( )方法来存取Activity的定制属性。 D) 关于流程Fa?ade EJB的JDNI名称 当我们创建完流程模型之后,我们要生成部署代码,这时WSADIE会自动生成一个与流程对应的Fa?ade EJB,该EJB是一个会话Bean,我们来看一下这个会话Bean的JNDI名称。它的JNDI名称由三部分组成, i)第一部分是创建流程时我们给定的流程的目标名称空间, ii)第二部分是流程模版的名称 iii)第三部分是创建流程时我们给定的流程模版的生效时间,其格式是YYYYMMDDTHHMMSS,其中YYYY代表年,MM代表月份,DD代表天,HH代表小时,MM代表分钟,SS代表秒。 每当重新生成部署代码的时候,就会产生一个新的JNDI名称。这正是由于Server Foundation支持流程模版的版本控制,每一个版本的流程模版有一个唯一的JNDI名称。而我们的其他应用逻辑部分是不变的,因此,在进行应用程序打包时,应该将流程相关的和其他应用逻辑相关的部分分开,确保在流程EAR中不包含应用程序EJB,否则当安装新的流程应用时,会产生应用程序EJB更新冲突。 E) 关于流程对外的API接口 除了JMS接口,流程的API接口有两种方式: 1)一是通过fa?ade EJB:在使用WSADIE进行流程开发时,会为每个流程本身产生一个会话Bean,通过它提供的接口可以进行流程开发,例如:
这种方法的不足在于:它提供的API功能有限,流程每变更一次,它的JNDI名称就会发生变化,编程代码就需要跟着发生变化,非常不灵活。 2)另一种是通过整个流程引擎服务器提供的统一入口:即com.ibm.bpe.api.BusinessProcess,通过它也可以进行流程相关的程序开发,例如:
采用这种方式的优势在于:它提供全部的API功能,对所有流程都是统一一个入口。因此,在实际应用中我们建议采用这种方式。 F) 流程中的数据流设计原则 在流程建模时,要考虑两种"流",一是流程内部的控制流程流转逻辑的控制流,一个是流程中的数据流。在设计数据流时,要注意: 1)使用一个统一的数据结构:尽量减少用于数据转换的Assign, Java Snippet活动的个数。 2)将流程相关的控制数据与用户业务数据分开,不能把流程变量当成用户数据的载体,进而将所有的用户数据都放在流程变量当中;相反,我们应该用流程变量来存储与流程控制相关的数据,而把真正的用户数据存放在外部数据库中。 G) 外部调用的不同绑定方式 当流程调用外部服务或者外部应用调用一个流程时,必须进行绑定操作。Server Foundation支持多种绑定方式:包括Java Binding、EJB Binding、JMS Binding、SOAP/HTTP-IBM Web Services、SOAP/HTTP-Apache、SOAP/JMS-IBM Web Services等,其中Java绑定和EJB绑定的效率较高,实际使用中我们可以尽量采用这两种绑定方式。 H) 交易补偿(Compensation)的使用 交易补偿是Server Foundation产品的一个重要优势,关于交易补偿的概念我们可以参考我们Developer Works网站上Susan Herrmann编写的《WebSphere Business Integration Server Foundation Process Choreographer 中的建模补偿》一文,文中详细描述了补偿的概念以及怎样对补偿进行建模,不失为一篇很好的文章。 简单来讲,在Server Foundation中配置Compensation的步骤如下: 1. 首先,为了支持补偿处理,流程必须在一个交易上下文中执行,在流程的Server属性栏中进行设定,定义Compensation Sphere的属性,其中包括四种:Not Supported,Supports,Required,Requires New。 2. 为Invoke 活动指定补偿属性。由于只有外部服务调用才可能导致数据更改,因此补偿只适用于Invoke活动。对于这种类型的活动,会存在补偿属性配置栏,在补偿属性配置栏定义补偿操作对应的合作伙伴连接、端口类型及相应的操作。 I) 异步流程的使用 对异步调用的支持是Server Foundation的一个优势,所谓的异步调用是指在流程执行过程中的某个环节上发出一个外部调用,不等待其相应,而是进行其他的业务处理。如果在流程的后续环节中需要得到外部调用的结果,我们可以通过Receive或Pick活动来迫使流程等待,直到接受到外部系统的响应为止。要使流程能够进行异步调用,我们必须要进行以下配置步骤: i)将流程配置为长流程,即可中断流程: J) 相关关系集合(Correlation Set)的使用 在异步调用中必须要解决的一个问题是在得到多个响应的情况下,如何将某一个请求和对其该请求的那个应答正确地配对,而不是张冠李戴?在Server Foundation中,解决这个问题的手段是通过相关关系集合。相关关系集合是联系请求和应答的一个纽带,能够很好地将二者关联起来。我们可以利用一个唯一标识来作为相关关系集合,例如:在银行取款时,可以用客户账号作为相关关系集合。关于如何使用和配置相关关系集合,我们Developer Works网站上李志编写的《WBI Server Foundation中的流程开发进阶》一文,文中给出了一个使用相关关系集合的具体例子以及配置步骤。 K) 其他可以提高性能的一些方法
L) 使用业务规则引擎(Business Rule Beans) 在传统的应用程序结构中,业务规则是包含在应用程序的业务逻辑中的。每当需要更改规则的时候,这种嵌入了规则的应用程序都需要修改应用程序代码,这就加大了定制和扩展的难度。而通过将业务规则从应用程序中移出可以使分析员能够描述独立于应用程序逻辑的处理规则。 Server Foundation提供一种通过一张简化的、直观的词汇表来表达并且是在业务流程的可变性情况下调用的业务规则:Business Rule Beans。我们可以通过使用业务规则引擎来嵌入业务规则,从而提高应用系统的灵活性。 |