APP下载

基于MVC架构的轻量级工作流引擎研究与设计

2011-03-14丁苍峰

电子设计工程 2011年10期
关键词:引擎组件架构

丁苍峰

(延安大学计算中心陕西延安716000)

工作流从提出至今,经过几十年的发展,取得一定的成果,但在实际应用中,应用的企业还是较少,应用的范围窄,效果不理想[1]。这主要是目前与工作流管理系统的全面性、集成性有关,也与企业应用的状况有关,最重要的原因是目前工作流产品功能齐全,结构庞大,系统复杂,标准化程度差,灵活性差,实现复杂,难于在不同系统之间进行交互,集成的效果不理想,不能很好地将SCM、CRM、ERP、和OA等具体业务流程处理系统紧密地联系在一起[2],多数产品的开发由于没有清楚地理解用户的需求,而不能满足用户的迫切需要,也不能灵活地集成到企业具体系统中。

为了克服当前工作流在应用中的不足,提出了一个基于整合MVC架构的轻量级工作流引擎,来进行系统的设计和应用。本文在设计引擎时主要考虑一个轻量级的核心,提供工作流管理系统所需要的基本功能,在此基础上,利用组件灵活的可拔可插特性,根据需要来添加各种工作流组件进行扩展工作流管理系统的功能。

新西兰Massey大学的Tagg等学者对工作流引擎的相信曾经使用过”轻量级”[3]这一术语,但是侧重点在于如何构造一个“瘦客户端”。而本文的设计重点则是设计一个基于MVC架构的充分支持工作流技术的小型内核,可以耦合到具体不同应用的MIS系统中,达到灵活应用的目的。

1 整合MVC的轻量级的引擎设计

miniFlow是基于整合MVC架构的Web环境系统,整个系统参照了J2EE架构,采用了Brower/ActionServlet控制器/BO业务逻辑层/Hibernate DAO层/DBMS数据库服务层多层的框架结构。轻量级是设计miniFlow系统所一直围绕的核心任务,为此,利用目前很流行的Struts2[4]、Hibernate[5]开源框架和Ajax[6]异步请求/响应技术来设计,主要采用了组件能拔能插的特性来容易地扩展工作流管理系统的其他功能。本文利用这些技术设计的miniFlow系统整体架构如图1所示。

图1清楚地描述了MVC架构基础上的工作流管理系统和应用进行集成的多层模型,分为客户端应用层、表示逻辑层、业务逻辑层,持久层和数据库服务层。

1)数据库服务层为工作流管理系统和业务系统通过持久层提供数据。

2)持久层用Hibernate进行数据库的完全封装,使软件开发者真正对数据库的操作是面向对象的操作,完全实现了面向对象的设计思想,并且在该层进行了对通用公共方法的封装,使整个系统都可以调用该公共方法,在进行对方法封装时,也设置了开关控制等操作,不仅提高了整个开发系统的效率,大大节约了项目的成本,也使系统开发的代码易于维护和便于以后的升级。

图1 miniFlow系统整体架构Fig.1Overall framework of miniFlow

3)业务逻辑层是由工作流管理和系统业务两部分构成。工作流管理系统是由工作流引擎组成,其中引擎是通过引擎调度中心进行控制,该中心可以根据业务逻辑对工作流引擎进行调用所对应的组件,组件分别由转发控制组建,任务指派组件,引擎调度规则组件等一些可以调度中心进行调度的组件,工作流引擎主要用来解释工作流建模工具所定义的业务流程。

业务逻辑层主要是处理业务信息的组件,它与工作流管理系统的组件进行松散耦合而形成表现层的控制逻辑ActionServlet调用的中间层组件。

4)客户应用层和表现逻辑层提供用户客户端界面,根据用户的权限不同而显示不同的信息,通过一系列的动态页面表现,这些Web页面由服务器JSP脚本创建,JSP脚本在Struts的ActionServlet控制器下通过WEB容器的ActionForm表单和业务逻辑层的工作流管理系统组件和系统业务组件进行交互,根据用户调用相应的工作流执行服务来执行组件的调用。

1.1 引擎控制器

引擎控制器是工作流引擎在运行时的控制中心,图2给出了引擎控制器的结构图。

引擎控制器接受从Action控制器发送过来有关流程控制的请求(如业务初始化、获取任务以及结束任务),然后根据不同的请求类型调用相应的组件或处理模块与本次请求相关的操作并将结果返回,由于是在DBMS内部实现工作流引擎的控制模型,因此有关请求的并发处理等问题完全可以交给数据库管理系统来完成,也不需要诸如请求队列等形式的数据结构。因此,可以将引擎控制器看成一个多线程的并发服务器,它可以对多个Action控制的外部请求提供并发服务。对外部请求的处理过程肯定会涉及到对内部数据结构中有关数据的读写和更改操作,这些数据的完整性和互斥操作可以通过持久层Hibernate提供的各种加锁机制来实现,从而实现了多个外部请求之间的独立性。

图2 引擎控制器的结构图Fig.2Framework of engine controller

1.2 引擎流程定义管理和解析组件

1)流程定义管理miniFlow使用流程定制工具,通过Ajax和JSON语言描述,在客户端进行业务流程定义的时候将该流程存在于JSON的对象数组类JSONArray的一个对象jsonArray中,然后通过Ajax的XMLHttpRequest一个对象类的send(“json=”+jsonArray.toJSPMString())方法,将jsonArray从客户端发送到服务器端。miniFlow的核心部分不涉及如何实现流程的定制,而是专注于将定制好的jsonArray数组字符串文件在服务器端读入,存储到数据库中。采用这样的解决方式,主要考虑到了系统的效率性能问题。在流程执行阶段,将会经常需要对流程的定义读取和解析,如果每次都直接读取jsonArray文件,将会导致系统性能的瓶颈。而每次读取jsonArray文件后,将会根据在客户端存储jsonArray文件的结构进行解析,获取流程、活动的相应信息,这也会降低系统的效率。

miniFlow在第一实例化流程时,通用在服务器端获取已经定义好的jsonArray文件,然后通过引擎流程定义管理和解析组件提供的repository接口中提供的save(String source)方法读取和解析文件,存储相关数据到数据库中,以后每次对定义的应用直接读取数据库。

2)流程定义解析miniFlow的引擎用Ajax和JSON语言描述的流程定义文件jsonArray读入,存储到数据库中,对于流程的定义信息,在设计工作流信息模型中设计了5个表来存储,分别是节点定义表TB_WF_NODE_DEFINE、前续节点集表TB_WF_PRE_NODE_SET、后续节点集表TB_WF_NEXT_N ODE_SET、流程角色表TB_WF_ROLE和节点类型表TB_WF_NODE_TYPE。

1.3 引擎规则控制组件

上面的介绍我们知道,工作流引擎程序运行在业务逻辑层,位于表示逻辑层的Action控制器调用业务逻辑层的引擎控制器,引擎控制器调用引擎规则组件和转发控制组件,通过检索业务流程的定义,与各模块业务表现逻辑层(客户端应用层)数据交互,引导业务流程的走向。在上面的miniFlow的数据模型的信息模型中,给出的表结构中有这样一个表NODE_TYPE,NODE_TYPE就是节点类型表,引擎规则控制组件就是根据节点的类型进行设计来流转业务的。

1)引擎规则组件类分析在设计引擎规则组件时候,首先定义了一个引擎规则接口Rule。根据节点类型定义,为此在开发引擎规则组件时,为每一节点类型都定义了一个类,该类都实现引擎规则接口Rule,返回的结果为任务状态,代码如下。

public interface Rule

{

public String isRule(EngineParam engineParam)throws Exception;

}

2)引擎规则控制器由上述可知,根据节点类型设计引擎规则组件时,针对每个节点类型都设计了相应的类,引擎规则控制器就是根据实际传入的节点类型,实例化相应的规则。由上述知识可清楚的得到引擎规则控制器Rule Ctr调用各个引擎规则类的图,如图3所示。

图3 引擎规则控制器调用引擎规则结构图Fig.3Engine rule controller calls engine rules structure

1.4 引擎转发控制组件

在miniFlow架构的核心部分,流程转发控制组件提供执行机制和环境,流程可以按照定义执行操作,也就是实现工作流的目标。一系列的节点操作构成一个流程,一个流程实例根据定义执行相应的操作,完成相应的任务。多个实例可以共同使用同一个流程定义,也就是说,一个流程定义模板可以使用多个流程实例,可以同时实例化多个实例。

转发控制组件采用动态实例化的方式,即流程开始的时候,只是实例化该流程的第一活动。第一个活动完成后,实例化后续活动。一是节省资源的开销,二是允许动态修改流程。这个组件主要实现流程运行期间的转发控制流向,包括流程启动(即流程实例化),任务跳转,任务终止等信息。

由上所知,工作流引擎控制中这些方法中又引用了接口FlowCtrl,该接口有executeFlow()静态方法,该FlowCtrl接口被FlowStartUp、FlowStep、FlowStop、GetFlowIdList、FlowCancel和FlowPause类型实现。由上述关系可以设计出工作流引擎转发控制组件和上述方法以及类之间的关系图,如图4所示。

图4 工作流引擎转发控制组件结构图Fig.4Workflow engine forward and control component framework

1.5 引擎权限控制组件

miniFlow权限控制组件是采用RBAC(Role-based Access Control Model)访问控制模型实现的[7],可以提供多层次的授权。角色为树状递归结构,功能也用树状递归结构实现,这样可以实现较复杂的用户权限管理。目前系统权限可以细分到专责一级,并且不同专责的权限可以由系统管理员灵活地、动态地分配。一方面保证了系统信息的保密性,系统的安全性,另一方面也增加了系统的灵活性和扩展性。

2 引擎可扩展组件

2.1 可视化流程定义工具

可视化流程定义工具独立于架构的核心部分,只是提供给用户可视化的操作界面,方便用户流程的定义。本课题在设计工作流可视化定义工具的时候,不是用工作流联盟所要求基于XML的流程定义语言XPDL,而是用JavaScript、Ajax和JSON等语言实现的定制流程的开发工具。它将用户可视化设计的流程定义以JSON的对象数组JSONArray或JSON对象JSONObject形式存储起来,该存储的形式是字符形式的,通过Ajax中XMLHttpRequest对象的方法send(),把JSON的字符串发送到服务器端进行解析,存储到数据库。

我们提出用JavaScript、Ajax和JSON来实现流程定义的语言,简化了流程定义中各种繁琐的设定。流程定义工具可以提供灵活的流程定义功能,该流程定义工具达到了设计miniFlow轻量级的要求,具有重用性、可移植性高的特点,几乎在所有的浏览器都可以实现流程定制的功能。

2.2 任务列表组件

这个组件包含标准的任务列表处理器和应用开发的任务列表处理器。其中标准的任务列表处理器包含了在标准规范定义中,用于工作流核心部分和参与流程执行。miniFlow的任务组件与WFMC规范中Worklist的接口要求有所不同,在miniFlow的任务列表组件中设计了3个接口,3个接口分别实现待处理工作,已提交工作和已完成工作,这3个接口提供了与工作流管理系统的交互界面。其含义如下:

1)待处理工作:表示当前用户要等待用户处理的工作,其任务状态为WAITING,等待用户来处理。

2)已提交工作:表示当前用户处理了等待用户处理的工作,在用户处理完后就表示已提交工作,其任务状态为除WAITING外的其他状态(RUNNING、CANCEL和SUSPENDED等)。

3)已完成工作:表示当前工作已经处理完毕或由于别的原因取消工作的执行,其任务状态为COMPLETED或FAI LURE或CANCEL等。

应用开发的任务列表处理器就是上面的3个接口的工作列表处理器,则是根据具体的应用系统开发的,用于应用系统的具体业务和引擎之间的交互。

2.3 日志信息组件

工作流管理系统存储流程的执行日志记录,在建立miniFlow架构的时候,显示日志信息的组件并不属于架构的核心部分。miniFlow通过增加一个独立的显示日志信息的组件来扩展架构。和传统的工作流架构不一样,这个组件并不是系统的一个组成部分,只是在应用需要的时候,把这部分功能集成。

每个应用系统,需要显示的日志信息会各有各的特殊要求,miniFlow架构的核心部分不包含显示日志信息功能,确保了架构的核心在轻量级别。这样,显示日志信息的功能可以灵活地集成也可以灵活地定制。

3 结论

本文介绍了基于MVC架构的轻量级工作流引擎,引擎的核心部分,提供了工作流最基本的功能,与核心的引擎规则和任务指派以及权限分配组件一起构成工作流的引擎。miniFlow基于MVC架构实现,还包括易于增加和裁减提供各种的工作流特性的扩展。采用该引擎系统可以进行二次开发的应用系统,提高企业运作的灵活性和适应性、为企业在激烈的市场竞争中赢得了更多的时间和机会,实践证明该设计是切实可行的。

[1]伍庆林,王加.基于J2EE框架的工作流管理系统设计与实现[J].计算机技术与发展,2008,18(4):107-110.WU Qing-lin,WANG Jia.Design and implementation of J2EE framework based on workflow management system[J].ComputerTechnologyandDevelopment,2008,18(4):107-110.

[2]牟军,吕立.使用轻量级框架进行J2EE应用开发[J].小型微型计算机系统,2006,27(6):1149-1152.MU Jun,LV li.J2EE application development based on lightweight framework[J].Mini-micro Systems,2006,27(6):1149-1152.

[3]Tagg R,et al.Preliminary design of a lightweight workflow server[C].In:8th Australasian Confon Information Systems,Australia,1997.

[4]Roughley I.Starting Struts 2[M].C4Media Inc,2008.

[5]孙卫琴.精通Hibernate:Java对象持久化技术详解[M].北京:电子工业出版社,2005.

[6]Asleson R,Nathaniel T.Schutt.Foundation of Ajax[M].金陵,等译.北京:人民邮电出版社,2006.

[7]Chandramouli R.Application of XML tools for enterprisewide RBAC implementation tasks[C]//Proceedings of the fifth ACM workshop on Role-based access control,Berlin,Germany,2000:11-18.

猜你喜欢

引擎组件架构
基于FPGA的RNN硬件加速架构
无人机智能巡检在光伏电站组件诊断中的应用
功能架构在电子电气架构开发中的应用和实践
新型碎边剪刀盘组件
U盾外壳组件注塑模具设计
蓝谷: “涉蓝”新引擎
WebGIS架构下的地理信息系统构建研究
无形的引擎
风起新一代光伏组件膜层:SSG纳米自清洁膜层
一种基于FPGA+ARM架构的μPMU实现