转载:WBI Server Foundation学习笔记

原创 2005年06月01日 10:45:00

内容:
1 基本概念
2 建模技巧
关于作者
对本文的评价
订阅:
developerWorks 时事通讯

娄丽军
软件部售前工程师, IBM
2005 年 5 月

WBI Server Foundation是IBM WBI产品家族中的一个后起之秀,有越来越多的开发者早已开始学习和掌握这个产品,本文将分为两部分,第一部分是关于Server Foundation的基本概念和建模技巧,第二部分是关于动态建模和JMS接口。

第一部分,我们来学习和掌握一下Server Foundation的基本概念和建模技巧。

1 基本概念

1.1 流程设计器体系结构
WBI Server Foundation由运行环境和开发环境组成,它的开发环境是WSAD-IE,在WSAD-IE中完成流程开发后,将流程的EAR应用部署到运行环境中。

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 业务流程语言
Server Foundation支持BPEL4WS(面向 Web 服务的业务流程执行语言)开发语言,BPEL4WS是专为流程整合而制定的一项规范标准。它从本质上来说是IBM的WSFL和Microsoft的XLANG的结合物,目前已经成为业界标准。


BPEL流程的要素包括:

1)合作伙伴连接(Partner Link):

在流程的执行过程中,流程本身和它的外部系统之间形成了调用和被调用的关系,通过定义合作伙伴连接来描述这种关系。合作伙伴连接描述了流程和外部系统之间的抽象服务接口,通过WSDL来定义。合作伙伴连接和一个合作伙伴连接类型(Partner Link Type)相关联,在合作伙伴连接中定义了每个流程参与方(Partner)的角色,合作伙伴连接类型中包含了这些角色实体的具体定义,包括端口类型(PortType),操作(Operation)和消息(Message)等。

2)活动(Activity):BPEL中的活动包括基本活动和结构活动两种。

其中基本活动是一些原子活动,主要包括:

接收:等待消息到达。在消息到达时,可以选择启动一个新的流程实例。

答复:发送消息,以答复在"接收"过程中收到的消息。

调用:调用合作伙伴提供的单向操作或请求-响应操作。

检取:等待多个消息中的某个消息到达,或者在获得超时警报后退出。

终止:立即终止某流程实例

赋值:以新数据更新变量的值。

等待:等待某一给定的时间期限,或者等待至某一特定时间点。

抛出:从业务流程内部生成一项错误。

人员交互:这种操作只能用于可中断的流程中的人机交互。它用来描述当一个流程执行到一定期间时,需要人的干预才能继续执行下去,这是IBM对BPEL的重要扩展。

JavaSnippet:调用内嵌的一段Java代码,这是IBM对BPEL的扩展。

变换器服务:调用先前定义的消息变换,这是IBM对BPEL的扩展。

而BPEL的结构活动包括:

流程:掌握同时进行的多项活动。

顺序:掌握按照字典顺序依次进行的多项活动。

利用以上两种操作可以实现流程的嵌套。我们可以创建一个流程序列,然后把它嵌套到大的流程中去,这样对于商业应用的的模块化设计以及代码的重用性都有非常重要的作用。

循环 (While):重复执行循环中定义的活动,直至循环推出条件满足为止,这是实现流程回退处理的重要手段。

连接:连接并控制流程中的活动之间的执行顺序。

条件 (Switch):从多项选择中选取某个活动分支。

3)控制连接(Control Link):控制连接决定了流程内部活动的执行顺序,在Server Foundation中,可以通过 连接活动来指定。另一方面,也可以通过每个活动的Join Behavior属性来决定。

4)变量(Variable):变量定义了流程中的数据,它包含了流程相关的控制数据和状态数据。

5)相关关系集合(Correlation Set):当流程进行外部异步调用时,相关关系集合是将调用的响应和调用请求进行唯一性关联的手段。

6) 错误处理器(Fault Handler):在流程运行过程中,可能会发生各种错误,可以利用错误处理器来进行错误处理。在Server Foundation中,我们可以为单个活动、一组活动以及某个流程添加错误处理器,在错误处理器中描述出错时的具体处理步骤。

1.3 业务流程开发
在Server Foundation中进行业务流程的设计和开发,只需要以下四个简单的步骤:

1. 创建服务
创建服务时可以采用两种开发模式,一种是自下而上的开发模式,即先创建完成业务功能的J2EE组件,包括Java类、EJB等,然后再创建服务;另外一种是自上而下的开发模式,即先创建抽象服务,即先创建WSDL服务描述文件,定义接口,其中包括消息及其部件以及端口类型及其操作,然后再创建服务具体的实现。

2. 创建和设计流程
在WBI中,流程分为两类,即非中断流程和可中断流程。一个流程即是一种多步骤的操作,包含了元素/操作(Activity)和连接器(Control Link),操作表示了要完成的任务,连接器表示了操作潜在的执行顺序以及条件。

在进行WBI SF开发时我们主要利用前面讲到的BPEL基本元素来设计流程,IBM 提供了WSAD-IE(WebSphere Studio Application Developer Integration Edition)开发工具来进行流程的开发。如下图:


开发人员可以在WSAD-IE中完成所有流程的可视化定制以及J2EE1.3 API中规定的EJB、JSP、Web Service等的开发工作。

3. 测试和调试流程
利用WSAD-IE中自带的流程跟踪诊断工具可以进行流程的调试,这是一个高效可靠的方法和手段,对基于流程的应用来说,可以大大缩短开发的周期。如下图:


4. 部署流程
当我们的流程应用已经被完全的测试完毕,就可以准备部署到产品环境中去了。其企业应用的安装方式同普通的J2EE应用完全一致,没有任何区别,流程模块包含在EJB模块中。部署业务流程时,首先利用BPEL 部署代码向导来生成业务流程项目的EAR文件,流程 EAR 包含:

ProcessEJB.jar (EJB 模块)--部署的 EJB、
ProcessWeb.jar (Web 模块)--部署的 Web 服务、
Process.jar --流程的BPEL描述文件三部分。

生成EAR后,要把流程 EAR 部署到 WBI SF的运行环境中,部署时需要完成在服务器上安装流程 EAR应用程序、创建数据表和数据源、为用于本流程的 CMP EJB 创建后端映射等工作。完成流程部署工作之后,我们就可以启动并运行流程了。

2 建模技巧
在使用Server Foundation时,首先我们需要了解和掌握一些业务流程建模的技巧,关于这部分内容可以参考我们Developer Works网站上李志编写的《WBI Smart Face系列二:WBI Server Foundation流程模式》一文,其中给出了一些典型的流程模式,在我们建模时是很有帮助的。这里,我再补充一些我学习到的一些技巧。

A) 正确使用Microprocess (非中断) 和 Macroprocess (可中断)流程

我们知道,在ServerFoundation中流程的类型分为两种,一种是非中断流程,非中断流程的特点是:在一个事物环境或是没有事务中被执行,不能包含任何异步的或是有人为交互的操作;另一种是可中断流程,可中断流程由一组分层的事务组成,可中断的流程可以是一个人机交互的过程或者一个异步调用的过程。在执行速度上,非中断流程的执行速度是可中断流程的10倍以上。但是,对于必须有人工参与的流程以及存在异步调用的流程却不得不采用可中断流程,因此,在尽可能的情况下,可以将自动化的、同步调用的流程和有人工参与、异步调用的流程分离开来。在实际项目需求中,我们通常会需要流程中有人工参与的部分,在这种情况下,我们可以将其中自动化运行的、不可中断的部分分离出来,将其封装在一个非中断流程中,然后在另一个可中断流程中调用这个流程。

B) 采用Java Snippet和Assign Activity来实现数据映射

在Server Foundation中,有三种方式可以实现数据映射,其中包括利用Java Snippet, BPEL Assign活动和Transformer Service。它们的功能特点分别是:

  • Java Snippet提供了一种在流程中添加Java代码的手段,利用Java Snippet,我们可以设置Activity的输入变量,或者为流程中的某些变量赋值,以便于在后续的Activity中使用这些变量。我们也可以利用Java Snippet来实现数据映射,它的优势在于:执行速度快,它是整个流程对应EJB的一个组成部分;另外,由于Java代码可以编写得非常灵活并且实现较强的功能。但它的不足在于:Java Snippet是IBM对于BPEL的扩展,不属于BPEL规范中的内容,因此它不标准,带有Java Snippet的流程模型输出后,在其他BPEL流程引擎上不能执行。
  • Assign Activity: 是专门用来做数据映射的手段。利用Assign Activity,我们还可以为Partner Link的定义赋值,从而实现动态流程调用。它的优势在于:执行速度也比较快;符合BPEL标准;更为重要的是它提供图形方式,来定义映射规则,不需要编写Java代码。它的不足在于:没有数据转换的功能。
  • Transformer Service: 是专门用来做数据转换的途径,可以实现不同Java数据类型的转换,如从Integer到String的转换。它的优势在于:提供了图形界面的方式,屏蔽了实现的细节;不需要编写代码。它的不足在于:性能没有前面提到的两种方式好,与Java Snippet一样,它也是IBM对于BPEL的扩展,不属于BPEL规范中的内容,因此它不标准。

在这三种实现手段中,我们建议采用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,通过它提供的接口可以进行流程开发,例如:



Context ctx = new InitialContext();
Object result = ctx.lookup("<MyProcess JNDI Name>"); 
<MyProcessName>Home processHome=     
(<MyProcessName>Home)javax.rmi.PortableRemoteObject.narrow(result, 
<MyProcessName >Home.class);
<MyProcessName>Process bean  = processHome.create();
bean.<ProcessInputOperation>(inputParameter1, inputParameter2….);

这种方法的不足在于:它提供的API功能有限,流程每变更一次,它的JNDI名称就会发生变化,编程代码就需要跟着发生变化,非常不灵活。

2)另一种是通过整个流程引擎服务器提供的统一入口:即com.ibm.bpe.api.BusinessProcess,通过它也可以进行流程相关的程序开发,例如:



Context ctx = new InitialContext();			
Object result = ctx.lookup("java:comp/env/ejb/BusinessProcessHome");
BusinessProcessHome processHome= 
(BusinessProcessHome)javax.rmi.PortableRemoteObject.narrow(result,BusinessProcessHome.class);
BusinessProcess bean = processHome.create();
bean.initiate("<ProcessName>", inputMsg);

采用这种方式的优势在于:它提供全部的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)将流程配置为长流程,即可中断流程:
ii)将用于外部调用的Invoke节点设置为one-way单向调用,即只有一个输入消息,没有输出消息。
iii)将外部调用的绑定方式指定为JMS方式,其他的绑定方式都是一个同步的工作模式,均不能用于异步调用。
iv)利用Receive或Pick活动来接受响应,当使用Receive活动时,要注意的是一定不能选择"Create a new Process instance if one does not already exist"选项。

J) 相关关系集合(Correlation Set)的使用

在异步调用中必须要解决的一个问题是在得到多个响应的情况下,如何将某一个请求和对其该请求的那个应答正确地配对,而不是张冠李戴?在Server Foundation中,解决这个问题的手段是通过相关关系集合。相关关系集合是联系请求和应答的一个纽带,能够很好地将二者关联起来。我们可以利用一个唯一标识来作为相关关系集合,例如:在银行取款时,可以用客户账号作为相关关系集合。关于如何使用和配置相关关系集合,我们Developer Works网站上李志编写的《WBI Server Foundation中的流程开发进阶》一文,文中给出了一个使用相关关系集合的具体例子以及配置步骤。

K) 其他可以提高性能的一些方法

  • 不要指定"Business Relevant"属性:对于指定了"Business Relevant"属性的Activity,流程引擎会将其相关信息写入审计日志数据库,这样会增大系统的开销。
  • 设置Partner Link的解析作用域为"Deployment",避免在流程执行过程中进行动态解析。
  • 尽量避免采用JMS绑定的方式
  • 尽量采用EJB绑定的方式,而非SOAP的方式
  • 尽量采用EJB绑定的方式,而非Process 绑定方式,例如调用另外一个流程时不要采用子流程的形式,而最好通过子流程对应的EJB Fa?ade来采用EJB绑定的方式。
  • 合理控制流程模版的复杂度:流程越复杂、包含的Activity越多,效率越低,合理的流程大小应该把活动的个数控制在50个以下。

L) 使用业务规则引擎(Business Rule Beans)

在传统的应用程序结构中,业务规则是包含在应用程序的业务逻辑中的。每当需要更改规则的时候,这种嵌入了规则的应用程序都需要修改应用程序代码,这就加大了定制和扩展的难度。而通过将业务规则从应用程序中移出可以使分析员能够描述独立于应用程序逻辑的处理规则。

Server Foundation提供一种通过一张简化的、直观的词汇表来表达并且是在业务流程的可变性情况下调用的业务规则:Business Rule Beans。我们可以通过使用业务规则引擎来嵌入业务规则,从而提高应用系统的灵活性。

关于作者
娄丽军,IBM公司软件部售前工程师,1998年加入IBM公司软件部,四年来一直从事IBM通讯及业务整合中间件(WebSphere Business Integration家族)产品的技术支持工作,是软件部从事该领域技术支持时间最长的工程师之一,拥有WebSphere Business Integration相关的产品经验,这些产品包括WebSphere MQ家族的所有产品:MQSeries, MQ Integrator, MQ Workflow以及CrossWorlds等,并具有很多大型项目的支持经验,曾参与国家税务总局,人民银行清算系统、华夏银行电子联行系统、中国联通计费系统、海关与国家税务总局互连系统,以及公安部、铁道部、中信实业银行、电信等重要客户的有关项目的技术支持。

Media Foundation学习笔记(八)编程练习:一个通用视频文件播放器

我将有关Media Foundation的函数调用封装到一个类CSpsPlayer中了,CSpsPlayer类的使用方法如下: 1)CSpsPlayer* pPlayer = new...

Windows Media Foundation学习笔记3——媒体播放

跳过第二章对工具TopoEdit的介绍,直接进行媒体播放的学习。   媒体播放这章,介绍了个文件播放的例子,想起当初学习dshow的时候,一开始也是个文件播放例子,不过那个例子比较简单,没多少代码,n...

Object-C 学习笔记(十三)---Foundation之NSString

字符串在软件开发中是最常用的数据类型,我们一起来学习OC里面的字符串各大操作 下面是字符串常用的基本操作,各种语言中都会涉及到这样的操作. 例子: // // main.m // Found...

Programming in Objective-C 学习笔记07——Foundation框架基础01

PART II —— Foundation FrameworkChapter 14-15Introduction a framework is a collection of classes, met...

Object-C 学习笔记(十六)---Foundation之NSMutableArray

NSMutableArray的基本操作: 例子: // // main.m // Foundation-NSMutableArray // // Created by 5016 on 13-...

《从零开始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

在Swift原生数据类型、Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销并不意味着内存什么都不用管。Swift类型内存...

Machine Learning Foundation Lecture 02 Learning to Answer YesNo 学习笔记

测试

Machine Learning Foundation Lecture 06 Theory of Generalization学习笔记

第六讲看完,继续学习笔记。         知识点1:从第5讲中我们知道了不用的hypothesis有不同的Growth function( )。         例如: Positive ray...

OC学习笔记13--Foundation框架中常用的struct介绍及使用

#import int main() { // CGPoint创建几个方式,结果相同 // {} 创建方式只能声明同时赋值,利用函数创建可以先声明后赋值 CGPoint p3,p4,p5; ...

Media Foundation学习笔记(八)编程练习:一个通用视频文件播放器

我将有关Media Foundation的函数调用封装到一个类CSpsPlayer中了,CSpsPlayer类的使用方法如下: 1)CSpsPlayer* pPlayer = new CSpsPl...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转载:WBI Server Foundation学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)