计算机与现代化2008年第7期JIS UAN JI YU X IAN DA I H UA总第155期文章编号:1006-2475(2008)07-0046-04收稿日期:2008-05-15作者简介:陈艳(1979-),女,湖北石首人,三峡大学电气信息学院助教,硕士,研究方向:计算机技术与应用。
基于J AVAEE 的工作流引擎的设计陈 艳(三峡大学电气信息学院,湖北宜昌443002)摘要:提出了一种基于J AVAEE 的工作流引擎设计方案。
详细介绍了工作流数据存储以及流程运转各个环节的实现原理。
关键词:工作流;引擎;J AVA EE中图分类号:T P311 文献标识码:ADesign ofW orkflow Engine Based on JAVAEEC HEN Yan(Co llege o f E lectr i ca l Eng i neer i ng and Infor m a tion T echnology ,T hree G orges U n i versity ,Y ichang 443002,Ch i na)Ab stract :T his paper presents the design sche m e o fw ork flow eng ine based on J AVA EE and the rea li zati on pri nc i p l e o f w orkflo w da ta st o rage and flo w runni ng on eve ry li nk .K ey w ords :workfl ow ;eng i ne ;J AVA EE0 引 言近些年来,有很多成熟的软件来满足企业的信息化需求,如办公自动化软件(OA )。
认真地剖析办公自动化软件得以成功的原因,除了计算机网络设备的普及外,根本原因就是办公自动化软件的核心系统的设计理念。
工作流系统是办公自动化软件系统的核心部件,它的功能是实现业务数据在由网络连接起来的企业计算机系统中运行。
它使得原本单独的计算机个体真正地组成了一个有机的能够自动化运行的网络系统。
工作流软件系统的核心实现是一个被称之为/工作流引擎0的程序。
通常这个程序被作为一个服务程序安装在服务器上,通过接受客户端发送的请求来进行处理,再把经过处理的信息反馈回客户端。
工作流引擎按照事先定义好的流程规则,自动地判断数据状态,然后将其自动转发给需要的人。
工作流系统除了应用于办公软件外,现在已经取得更广泛的应用,如生产销售物流等各个领域。
这些领域的数据处理自身没有流程的概念,但是如果考虑的范围更大一些就可以发现,这些数据实际上还是处于一种有序的业务流程运转之中。
比如说在零件的生产过程中,必须按照一定的工序来完成,有明显的分级传递过程。
笔者基于J AVAEE 设计了一套工作流引擎程序,按照目前投入使用来看,能较好地解决企业的各种业务流程。
1 工作流管理系统工作流管理系统主要由三类构件组成,这三类构件分别是:(1)软件构件:完成工作流管理系统不同组成部分功能的实现;(2)系统控制数据:工作流管理系统中一个或多个软件构件使用的数据;(3)应用与应用数据:对于工作流管理系统来说,他们不是工作流管理系统的组成部分,而是属于外部系统和数据,他们被工作流系统调用来完成整个和部分工作量管理的功能。
工作流管理系统的体系结构如图1所示。
2008年第7期陈艳:基于J AVAEE的工作流引擎的设计47图1工作流管理系统的体系结构图2工作流引擎的数据存储原理数据的存储主要借助于/XML+数据库0的方式完成。
系统中定义的流程以及流程运转实例数据以X M L的方式进行封装,存储于数据库中,系统调用时从数据库中读出来,将XML进行解析呈现到页面。
之所以采用XM L+数据库相结合而没有直接用XML 文件存储的原因,主要是因为考虑到读取性能方面,文件输入输出的速度比读取数据库要慢。
X M L代码框架如下:<NODE_ROOT fl ow I D="1211870"fl owN ame="公文流转-发文流程"><nodeT ask end N ode="fa lse"head N ode="true"taskID ="9522282"taskN a m e="发文流程-起草文件">,</node T ask>...<nodeT ask></node T ask></NODE_ROOT>X M L代码以<NODE_ROOT>为根结点。
fl o w I D 属性表示流程定义I D,fl o wNa m e属性表示流程的名称。
<node Task>是工作流的环节结点。
每个工作流由一个或者多个这样的结点构成。
endNode属性表示这个环节是否是工作流终点。
headNode属性表示这个环节是否是工作流的起点。
task N a m e属性表示这个环节的名称。
3工作流引擎的设计3.1工作流引擎类模型设计工作流引擎的设计实际上是引擎类模型的设计。
类模型反映各类之间的各种关系,如图2所示。
图2工作流引擎模型UM L图eng i n e类是引擎的核心类,引擎的主要功能函数都集中在此类中,oa Rule类是规则引擎类,用来定义流程定义当中的各类规则,fl o wCache类的作用是将流程存在缓存中,便于随时快速的读取,以此来提高引擎的性能,flo wBox类用于存取各种状态的流程,如待办流程、已办流程等。
fl o wT i m eContro l类是引擎时间控制器。
3.2运行时数据描述工作流运行时,工作流根据工作流的定义会产生一系列的进程。
但是工作流引擎从理论上来讲,引擎是无状态的系统,引擎又需要与大量的用户数据打交道,并且还需要识别不同的用户和流程。
因此,需要实现一个存储系统来为工作流引擎的实时系统服务。
其实,工作流引擎所需要的实时数据的模型与工作流定义是相似的。
工作流定义首先声明了一个工作流,然后再细分这个流程,划分成很多个业务环节。
工作流的定义就是定义业务逻辑怎样一个接一个的运行。
用图3表示这个数据模型。
图3流程运行时数据模型而运行时工作流引擎也是在定义数据的指挥下,将业务进程接力发送的。
工作流在接收到用户启动流程的请求后,会为用户所启动的这个流程建立一48计算机与现代化2008年第7期个进程,在这个进程中记载了谁在什么时候启动了什么流程的进程。
工作流在把进程转发到用户名下的时候,会为他当前所办理的环节业务建立环节进程,这个进程同时指向工作流定义的总进程和环节业务的定义。
环节进程的内容包含了谁在执行哪个环节定义的任务。
另外,环节进程的内部还使用XML对一些扩展信息进行了封装,它们用来专门记载这个环节从哪里来,到哪里去,回滚到哪里环节,还记载这个环节进程使用了哪些数据,并记录它在电子表单实体表中的位置。
3.3初始化引擎调用初始化引擎函数init E ng i n e(),传入人员I D 和需要启动的工作流定义就可以完成初始化操作。
这个函数的操作过程的步骤如下:(1)检查工作流是否已经被初始化,如果初始化了则不能重复初始化。
(2)检查工作流定义的缓存是否建立。
(3)通过flo wBox计算出能够启动这个工作流定义的人员列表,所谓启动人员列表就是这个流程的首结点的操作人范围。
如果这个人不在这个范围中,则表示该人不能启动这个流程。
(4)从缓存中把流程定义读取出来,作为副本存储在工作流引擎中。
那么此时如果全部成功的完成了,则表示工作流引擎已经为启动这个流程作好准备了。
3.4启动流程初始化引擎完成后,就可以执行启动流程的操作了。
启动流程使用函数start F lo w()来完成。
函数启动工作流的一个实例进程,并在数据库中留下记录信息。
其工作过程如下:(1)检查引擎是否启动,且检查引擎是否是为了启动流程而进行了初始化。
因为启动流程所需要的初始化信息和后面的载入进程的初始化信息是不一样的。
为了识别,引擎使用一个变量进行标识。
(2)初始化一个流程运行实例信息。
(3)初始化一个环节进程实例信息。
(4)执行数据库操作。
(5)转换工作流引擎到载入进程的初始化状态,准备其他的操作。
3.5电子表单数据引擎用户数据库在项目部署完成以后才产生电子表单,面对用户数据的读写,根本无法采用传统的方式来完成。
这个类仅提供两个公共函数:appendData()函数用来追加数据,get D ata()函数用来读取数据。
3.6办理业务办理业务就是执行eng i n e类的deal T ask函数。
该函数的目的就是为了把用户数据提交到服务器并产生存储。
初始化工作流引擎后,该函数就能够知道往正确的地方存储数据。
通过前面介绍的工作流引擎的运行模型可以知道,每个流程的环节进程都是独立的拥有一个记录来记载信息的,而且通过数据引擎的特性可以知道,每个数据集完成操作以后,都会把记录存储的位置信息返回给用户。
两者需要被关联起来,否则工作流的进程就没有办法和用户办理业务的数据相联系。
环节进程信息使用XML格式来记录,数据关联通过<ETABLE>标签,其中定义的<ROW>标签来记载电子表单数据集引擎完成操作后产生的位置I D。
3.7路由导航路由与导航的工作就是基于当前的工作流环节的定义,找出下一个环节是哪个。
eng i n e类的nav-i gate Nex t()函数用来完成这个任务。
程序先找到当前环节的定义,并分析环节的路由部分定义。
读出下一步的环节列表。
然后再试图读取鉴别模型的路径集。
在路由定义中,设置self C yc l e属性,这个属性表明这个环节是可以自循环的。
程序如果发现了这个属性为true,就在自动导航结果中加入当前环节。
在发现鉴别模型的情况下,程序会调用规则引擎,并将鉴别模型引入,然后将结果计算出来,这个结果就是下一步的路径,然后从路径中取得下一步的环节列表。
在上面的步骤完成以后,只能得到了下一步可以使用的环节列表,而在实际引用中,还必须知道下一步是哪些人相关,以便用户可以选择。
在知道环节列表的情况下,可以使用m ake People L ist()函数来计算人员范围。
3.8发送发送环节的操作由eng i n e类的post()函数来完成。
这个函数的参数是一个H ashtable。
参数H ash-table可以有多个结点,每个结点对应的是当前工作流定义中的一个环节,同时每个结点下又包含若干个人员I D,这些I D就是被用户选择来发送的目标人。