一种高效工作流引擎设计_第1页
一种高效工作流引擎设计_第2页
一种高效工作流引擎设计_第3页
一种高效工作流引擎设计_第4页
一种高效工作流引擎设计_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一种高效工作流引擎设计葛中泽(鄂州大学 计算机系,湖北 鄂州 436000)摘 要: 针对目前工作流引擎效率不高的问题,从实用的角度出发,提出了一个基于事件驱动的高效工作流引擎设计方法。以组件技术为基础,内存列表变量为数据存储对象,基于事件驱动,设计了一个容纳组件的工作流引擎容器,为工作流的高效运转提供了一个支撑平台,提高引擎对数据的访问速度和系统的运行效率,尤其是提高工作流管理系统可靠性及其在处理大规模复杂的且具有并行业务的流程方面的能力。该引擎操作简便、安全稳定、易于维护和移植,上线近一年来,数据量已达百万级,运行情况良好,在实际应用中得到了检验。 关键词:事件驱动;工作流引擎;组件技术;

2、高效中图分类号:TP319 文献标志码:A The Design of an Efficient Workflow Engine Ge Zhongze(Department of Computer Science, E Zhou University, Ezhou, Hubei, 436000)Abstract:Aiming at the problem of the low efficiency of the workflow engine, from a practical perspective, this paper puts forward the design of an effi

3、cient and flexible workflow engine. Based on the component technology and event driven, focused on the list of variables to memory for data storage, it designs a component container to accommodate workflow engine, provides a supporting platform for the flexibility of workflow, increases the speed of

4、 the engine access to data and the operation efficiency of the system. The engine is simple, safe and stable to operate, easy to maintain and transplant. Having been online for nearly a year, the amount of data has reached to millions. Running in good condition, it has passed the test in practical a

5、pplication.Keywords:Event-Driven;Workflow Engine;Component technology;Efficient0引言由于信息技术的发展和日趋激烈的商业竞争,人们不再满足于独立、零散的办公自动化和计算机应用,而是需要综合的、集成化的解决方案。作为一种对常规性事务进行管理、集成的技术,工作流管理系统的出现是必然的。它不仅可以改进和优化业务流程,提高业务工作效率,而且可以实现更好的业务过程控制,提高顾客服务质量,提高业务流程的柔性。工作流引擎是工作流管理系统的发动机,它直接关系到流程是否能够顺利执行以及流程的执行效率,其效率和可靠性直接决定了整个系统质

6、量1,因此设计一个高效的工作流引擎是非常重要的。目前工作流引擎多采用基于数据库的数据访问方法,该方法存在效率不高的问题。为了提高引擎的工作效率,本文采用列表存储数据,基于事件消息驱动的方法来设计了一种高效的工作流引擎,对引擎的功能结构、实现方法作了详细的描述和分析;并对两种引擎的性能进行测试和分析,结果表明本设计是可行的,能有效提高引擎效率和性能。1 目前工作流引擎研究情况多年来,工作流引擎的问题一直是工作流领域内重要的研究内容,吸引很多学者和研究机构进行了大量深入的研究。文献2 基于.NET 编程平台,开发了一种轻型工作流引擎,实现了工作流实例的解析加载和各活动节点的有序仿真运行。文献3以X

7、PDL作为流程定义语言,采用 Java 技术,实现一个轻量级工作流引擎设计,以方便地嵌入到面向流程的应用程序中,实现工作流系统管理的功能;文献4提出了一种基于 Web 和关系数据库的能适应动态工作流模型的柔性工作流引擎, 改变了传统工作流系统“僵硬”的收稿日期:基金项目:湖北省教育厅科研项目(B20148004)作者简介:葛中泽(1969-),男,湖北鄂州人,副教授,硕士,研究方向为组件化软件工程、软件过程自动化。Email:gzz-518,联系方式式,解决了工作流引擎的柔性化问题;文献5 提出一种基于数据驱动的工作流运行方式,实现了活动与活动之间的松散耦合; 文献6

8、提出了数字化校园工作流引擎的系统框架,详细论述了工作流管理、并联审批与分支选择、双向流转与约束、Web服务封装等关键技术的实现。这些研究采用了不同的设计语言,不同的应用角度提出了工作流引擎的设计方法。仔细分析这些设计方案,可以发现他们都是基于数据库的数据访问为基础,以数据库管理系统为操作对象的设计方法。该设计存在效率不高,难以承载大流量高并发数据访问的问题7。2高效工作流引擎的设计2.1引擎的结构设计工作流引擎结构设计采用模块化设计,如图1所示,它包括XML解析器、任务列表管理器、调用接口、监管器等七个部分,并统一放在引擎容器中。具体为:图1 工作流引擎体系结构 XML解析器是对工作流定义的X

9、ML格式文档进行解析,生成一个过程实例并添加到过程实例列表中。任务列表管理器是用户与工作流引擎进行交互的接口。该模块能根据参与者的特征返回具体的活动任务,由用户对该任务进行操作,如审批报告,起草文件等。调用接口是被调用应用程序和工作流引擎之间的接口,主要包括被调用应用程序和引擎之间的通讯及数据处理功能。引擎容器能将活动的数据传递给应用程序,应用程序处理完后将结果返回给引擎。由于引擎容器的很多处理都是在其他应用程序中完成,因此引擎需要此接口来调用外部程序。数据库操作基本组件的作用是连接数据库,操作数据库中的记录。由于在设计上采用了List列表数据来保存工作流中的过程实例,该列表数据在服务器停机或

10、停止工作时会消失,因此运行数据必须持久化保存到数据库中。使用此组件,引擎在启动的时候能将运行的过程实例加载到内存列表中;在引擎停止之前,能把内存的数据转移到数据库中持久保存。监管器是对工作流引擎进行管理和监督的模块,实现了工作流引擎的管理和监督。客户可以通过该模块实现对流程的干预,包括提前执行、挂起、激活、删除、暂停、终止等操作。它包括用户管理、过程实例的管理、角色管理、和数据管理。事件处理器作用是收集容器中的活动实例在运行时由于状态改变发出的各种消息事件,并对这些事件作相应的处理,在活动发出“准备就绪”消息时,它就运行该活动对应的“运行程序”;活动发出“结束”消息时,它就运行路由程序,找到下

11、一个运行活动。在本结构图中,不同于其他设计的是过程实例列表,它是用来存储“运行中的过程实例”的内存列表变量,引擎所有操作都是围绕它进行的。使用列表变量存储“运行中的过程实例”,能有效提高数据的访问速率,从而提高系统的工作效率。容器内核是容器运行的关键部件,它包括启动容器、加载数据、卸载数据和停止容器的功能。2.2 引擎容器的设计89图2 工作流引擎容器的UML静态结构图图2是引擎容器的UML静态结构图,其中引擎容器(WorkFlowContainer)是工作流的核心组件,它内置实例数据列表、事件处理器、任务管理器、容器运行监管器和XML文档解析器。它拥有引擎开始和停止的操作方法以及加载数据和卸

12、载数据的方法。容器用WorkFlowContainer类描述,其中instances是一个List类型的静态成员变量,用以保存引擎工作中的所有过程实例。本设计把过程实例存储在instances内存变量中,而不是采用一般设计所使用的“数据库保存”,目的是便于快速访问实例数据,提高引擎的工作效率。Instances的初始化采用单件模式,在容器的构造函数中进行。节点事件处理器(nodeHandler)是对活动节点发出的事件(节点准备就绪、节点运行完毕)进行处理的对象。它使用了INodeHandler接口来处理各种不同类型的活动节点的事件,处理方法NodeRun()是在节点准备就绪后运行节点的应用程序

13、,NodeRoute()是在节点运行完毕后进行路由,找到下一个运行节点的方法。不同类型的节点实现INodeHandler接口的方法各不相同,这将在2.2节中详细论述。任务管理器(taskManager)是工作流引擎和用户进行交换的接口。用户通过GetTaskList方法从过程实例列表Instances中获取与自己相关的任务,使用OutPutTaskList以表格的形式将任务输出到页面中。当用户点击其中一个任务是,用GetActivityByID方法找到该任务后调用OutputTaskDetail以字符串的形式输出任务的详细信息,用户还可以用OutPutAllApproval方法来查看任务之前的

14、审批内容。Approval()是用户审批的方法,它将审批内容以参数的形式保存在到任务的Paras参数列表中。Agree()和DisAgree()分别是用户审批时同意和不同意的执行方法。由于任务有轻重缓急之分,特别是在任务比较多的情况之下,对其需要进行排序。GetTaskList(Employ)方法的实现过程为:(1)在引擎容器的Instances列表中使用List.FindAll()方法找到职员Employ所涉及的所有任务列表。(2)在职员的所有任务列表中使用List.Sort()分别按上述的排序方法进行排序。排序过后的任务列表能让用户及时审批处理重要事情,提高工作效率。容器运行监管器(reg

15、ulatory)是管理人员用来管理和监控引擎工作的接口。它包括查找正在运行的、挂起的或已经完成的过程实例,暂停、回复实例,以及修改、删除实例等。XML文档解析器(parser)是用来解析过程定义文档。在读取定义文档后,解析器根据文档内容生产一个过程实例,并将该实例添加到引擎容器列表中,同时启动和持久化该过程实例。引擎容器除了具有上述成员外,还具有一些操作方法。其中Load()是加载过程实例数据的方法,在使用构造函数建立一个容器对象后,必须把数据库中保存的还没有运行完的过程实例加载到instances列表中。Start()是开始容器的运行:容器在加载完过程实例后,就开始实例的运行。一但应用系统停

16、止工作,就需要使用UnLoad()方法来将没有完成的实例持久化保存到数据库系统,同时释放instances占据的内存空间。Stop()方法用来停止容器、销毁容器。2.3节点事件处理器节点事件处理器是一个INodeHandler接口,包含有Run( )和Route( )两个方法。由于工作流拥有开始、结束、条件判断、分叉、合并、活动等各种类型节点,节点按运行方式又有自动和手动之分,因此每种节点事件处理器的实现INodeHandler接口方式各不相同。开始和结束节点的处理器(StartNodeHandler和EndNodeHandler):当引擎容器收到开始和结束节点的“准备就绪”、“完成”事件后,

17、调用对应事件处理器来处理该事件。StartNodeHandler对象的Run()方法无执行程序,Route()方法通过节点的转移找到下一个节点,并把它的状态设置为“就绪”,激发其“准备就绪”事件发生。EndNodeHandler对象由于是最后一个节点无需路由,因此其Route()方法是空运行;其Run()方法将节点和对应过程实例的状态设置为“完成”。分叉节点处理器(ForkNodeHandler):分叉节点是将一个节点的执行分成几个并行的执行,当引擎容器收它的“准备就绪”、“完成”事件后,分别运行分叉节点事件处理器对象的Run()、Route()方法。Run( )方法无事件处理,只需把分叉节点

18、的状态设置为“完成”即可,Route()方法则通过分叉节点的转移找到所有并行节点,并把它的状态设置为“就绪”。合并节点处理器(JoinNodeHandler):当所有并行节点运行完毕后,由合并节点来完成路由的合并。合并节点事件处理器的Run()方法同样只需把合并节点的状态设置为“完成”即可,Route()方法则需要判断所有并行节点是否都已“完成”,如果“完成”就找到下一个节点并激活它;否则不能路由。一般节点处理器(GeneralNodeHandler):一般节点是指处理业务的活动节点,如“起草报告”,“邮件通知”。它又分为自动和手动运行两种方式,如“起草报告”是手动执行的节点,“邮件通知”是自

19、动执行的节点。一般节点的事件处理器使用Run()方法处理节点的“准备就绪”事件,如果一般节点是手动型的,则无需做如何事情,由人工完成;如果是自动型的,就找到节点的Action对象,在其class属性中保存有可执行程序的“.dll”文件。使用编程系统的反射机制加载该文件,实例化并运行执行程序。由于需要引擎处理的应用程序业务不同,只要其实现ActionInterface接口,然后生成为“.dll”文件即可由引擎自动调用。一般节点的事件处理器的Route()方法很简单,在找到下一个节点后修改其状态为“准备就绪”即可。条件判断节点处理器(IfNodeHandler):条件判断节点分为手工和自动类型,手

20、工判断是由人工来执行的判断,如“同意”、“不同意”;自动判断是由引擎来进行的判断,如“金额大于1万元吗?”,它需要引擎读取实例的金额数据来自动作出判断。条件判断节点事件处理器的Run()方法对于手工判断类型不作任何处理,由人工通过设置节点的“To”参数值来完成;对自动判断类型与GeneralNodeHandler一样,由运行实现ActionInterface接口的“.dll”文件来设置“To”参数值完成。Route()方法读取“To”参数值,根据“To”参数值作相应的路由。2.4 事件驱动下的引擎高效运转机制一般引擎采用“查询方法”来实现流程的运转,即开启一个进程,轮询数据库中活动实例的状态(

21、state),如果其发生变化,则执行对应的程序。为了提高效率,本设计采用了基于事件驱动的流程运转机制,当活动状态发生变化时,就会发出消息,活动所在的过程实例收到消息,立即通过事件处理器执行对应的程序。图3是手动活动节点工作流的运转过程,引擎过程实例在处理完StateInitiatedChange事件后,活动停止运行,直到用户参与活动的任务且完成后,将其state设置为“completed”,过程实例接着执行下面动作。图3 基于事件驱动的手动流转模型工作流的流转采用了事件驱动机制。事件驱动机制在一个对象的状态发生变化时,能够及时通知其他对象,使其根据事件的不同作出不同的反映。在这里,一旦活动发出

22、“准备就绪”事件,过程实例对象就立即运行活动的执行程序;程序手工执行完毕,活动又发出“运行完毕”的事件,过程实例对象在收到此消息后,执行路由程序,找出下一个活动节点,并将其状态有“原始状态”改写为“准备就绪”,重复前面的过程。3 性能测试一般引擎采用操作数据库来访问数据的方法,本设计采用直接访问列表对象的方法,为了测试两种引擎的性能,对它们进行了运行比较。测试的硬件环境为: 处理器AMD Sempron X2 190,内存 2048MB。软件环境操作系统:Windows 2003 server。开发平台: 2008。运行环境:IIS6.0+SQL2005。实用工具:LoadRunner8.1。

23、表1是利用测试软件模拟不同的用户并发数,对两个引擎进行访问,记录引擎一个自动活动(通知用户)实例开始运行到离开该活动的平均时间(单位为毫秒)。平均时间并发数表1 两种引擎性能测试参数表 引擎类型110100500一般引擎27.1234.4141.5757.26列表引擎(本设计)12.0212.4113. 4515. 79从表中可以知道,本设计采用的列表引擎在同一个活动运行同一个外接程序到离开该活动所需时间比一般引擎少得多,在并发数增大时,这一优势更加明显。4结束语本文以.net作为开发平台,以引擎容器和组件技术为基础,提出了一个高效工作流引擎设计。该引擎是从制造企业办公自动化系统项目中提炼出来的,该系统自从2012.3上线以来,运行情况良好,数据量已达百

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论