郭玉彬,蔡泽野,林泽伟,徐银鹏
(华南农业大学 信息学院,广东 广州510642)
动态工作流技术是专门为企业适应复杂多变的市场而提出来,近年来已成工作流领域的研究热点。很多工作流厂商和学者对这一技术进行了很多研究和实现,例如,Fang Ru等[1]研究过程模型的动态性问题,定义了5种过程模型的变更模式,当流程发生变更时,综合利用这5种模式进行流程变更。北京航空航天大学的孙海龙教授团队[2,3]设计并实现了一个支持动态演化的组合服务执行引擎,用于可信软件的动态演化,其组合服务运行实例迁移算法,其核心算法LiveMig是组合服务运行实例算法。南京大学吕建教授团队[4-6]研究了过程以及服务组合的动态演化问题,提出了一种基于柔性迁移技术的过程动态演化方法,并给出支持自适应性的可变过程模型及其实现。另外,文献[7-10]分别给出不同环境中动态工作流引擎的设计与实现方案。
本文研究动态工作流引擎的设计与实现,提出一种轻量级动态工作流引擎的框架结构,称为LWDWE(lightweight dynamic workflow engine)。该引擎借用Petri网的思想,将模型看作静态结构,将过程实例看作托肯(token)所代表的系统状态下一系列变迁(transition)的发生。由此可将工作流模型与实例完全分开,方便对过程修改的支持和实例的动态迁移。LWDWE 支持基于过程和基于活动的两种动态修改策略,本文首先给出LWDWE 支持的工作流模型、架构和接口设计和调度机制,然后给出流程的动态修改策略及过程动态修改算法。最后,给出利用Spring 和Hibernate开源框架实现的原型系统,并通过一个应用实例证明了引擎设计的可用性。
jBPM 是当前流行的工作流执行引擎,它使用用JPDL(jBPM process definition language)语言描述基本的工作流程。借鉴JPDL 思想,LWDWE 将工作流中各元素抽象为控制节点和业务节点两类,控制节点是工作流中用来控制流程流转的节点,业务节点是流程中需要参与者或者第三方应用程序参与的节点。而流程是由两种节点组合起来,完成某种应用功能的执行步骤序列。
表1给出本文流程节点的说明。LWDWE 共使用三类业务节点FormTask、ToolTask 和SubFlowTask,其中FormTask是表单任务,即需要参与者以表单提交方式完成的任务,ToolTask 用于实现第三方工具的调用,Sub-FlowTask 是嵌套子流程,方便流程的层次化设计。控制节点分Start、End、Split、Join、Decision和State这6种。借助这些控制节点可实现顺序、并发、聚合、判断等流程结构。
LWDWE使用与JPDL类似的标签,如<process>、<start>、<end>、<split>和<transition>等来表示流程。图1给出一个简单的流程实例及其XML表示。该流程只Start、End、A 和B 这4 个结点。结点A 是表单结点,其ID 为3,其后续结点只有一个,即结点B。结点A、B之间的顺序关系通过结点A 的transition属性表示。一般业务结点的transition属性只有一个取值,即它与前、后序结点处于顺序关系。而控制结点的transition属性可取多值,表示可能与前、后序结点处于选择或并发关系。
表1 流程节点的详细说明
图1 一个工作流实例及其XML文件
LWDWE采用总线型结构,如图2 所示,整个引擎由一个运行总线(ExecutionContext)和以接口形式挂载其上的服务构成。总线型的设计可将所有服务集中起来,便于工作流引擎的统一调用,管理和配置简单,且具较好的可扩展性。当需要扩展新功能时,可增加新的服务接口并挂载在运行总线上。而系统已有服务的功能修改则可通过重写接口实现类来实现。
图2 LWDWE架构设计
如图2所示,工作流引擎对外提供各种服务接口,包括:流程执行服务接口(ExecutionService)、流程部署服务接口(RepositoryService)、人工服务接口(TaskService)、流程管理控制服务接口(ManagementService)、流程查询服务接口(HistoryService)、身份认证服务接口(IdentityService)、内核管理器(KernelManager)和Dao工厂(DaoFactory)。LWDWE通过调用这些服务接口来实现创建、执行和管理流程。
ExecutionContext是运行总线的实现类,所有的服务都挂载在上面。ExecutionService是流程执行服务接口,是引擎中最常用的接口之一,提供创建流程实例、启动流程实例、推进流程实例的运转和设置流程变量等功能接口。引擎通过该接口来控制流程的执行。RepositoryService是流程的部署服务接口,提供对流程模板的部署、查询和删除操作。通过该接口,LWDWE可以轻易实现对流程的部署等
TaskService是引擎的人工服务接口,提供对流程实例(Task)的创建、提交、查询、保存和删除等操作。当流程流转到表单任务节点时,引擎会根据定义将任务实例分配给指定的参与者。ManagementService提供异步工作相关的执行和查询服务。HistoryService提供对已经执行的流程实例、任务实例和流程变量等的查询。IdentityService,服务接口。提供对流程用户及角色成员的身份认证相关服务。KernelManager是维护流程正确运转的管理器。DaoFactory提供程序所需要的各种Dao操作。限于篇幅,本文仅在表2给出ExecutionService接口的详细设计,介绍主要接口函数信息。
表2 ExecutionService接口的设计
LWDWE中,过程模型被看作一个Petri网的网结构,执行实例则被看作一次执行。启动一个流程实例的时候,LWDWE依据流程模板(ProcessDefinition)生成一个Execution来表示这个流程实例。当流程实例流转到某个节点时,Execution根据节点类型获取相应的动作并执行。当某结点执行完成时,则由Execution获取节点的所有转出连接弧(transition),依据相关流程变量的值选择转出连接弧、流转到下一节点。
工作流的流转分顺序与分发两种情况。顺序流转指Execution完成一个节点的执行后获取其所有的转出连接弧,从中选择一个并流转到下一节点。分发流转则是指流程实例运行遇到一个分发(Split)节点时,流程实例会依据其转出连接弧个数,产生多个子流程,并使同时进入这些子流程执行。对分发结点的实现,Execution对象保存一个List<Execution>类型的变量,引擎计算分发(Split)节点的具体转出连接弧的数量,同时产生相应数量的子Execution加入到该变量中,原Execution则在聚合(Join)节点等待。当该变量中所有子Execution都到达聚合节点时,原Execution将该变量清空并指定Join节点相应的行为,然后流转到下一节点。为区别Split节点和处于List变量中的Execution,系统用RootExecution 表示流程实例开始时绑定的Execution,而用SubExecution来表示List变量中的Execution。图3给出具有两个分支结点的分发流转的执行情况。
工作流的顺序流转表达过程结点之间的顺序、选择关系,而分发操作表达过程结点之间的并发操作。由此,LWDWE可对所有包含顺序、选择、并发结构工作流进行执行。
图3 分发流转
流程动态修改一般将其分为过程级修改和活动级修改两类[2]。其中过程级修改指流程实例运行时对流程模板的修改。而活动级修改指对流程实例中未运行活动的临时修改,比如修改活动属性,这种修改只针对具体的流程实例,不改变流程模板。LWDWE对这两种动态修改都提供支持。
对于过程级修改,目前动态工作流系统一般采取重新启动、继续执行和转换3种策略[4]。其中,转换策略是指将正运行的过程实例迁移到新的工作流程模板上运行,这种策略不需要重启流程,放弃实例已完成部的执行结果,使得流程实例能够跟上模板变化,具备灵活性,但其实现相对困难。
本文利用流程模板的版本区别实现过程实例的转换策略。即将对流程模板的修改用不同版本记录。过程实例需要流转到下一结点时,依据条件选择使用原版本的过程模板还是转换到最新版本的过程模板继续后续部分的执行。由于动态转换时流程实例中的已经产生了部分流程数据,为避免与新定义模板的活动产生数据冲突,本引擎给出如下的规定:
假设M 为旧的过程模型,l为过程实例X 在旧的过程模型中已经执行的活动序列。MN为修订后的过程模型,ln为活动序列l在MN中的投影,若满足:(M≠MN)Λ(l=ln),则允许动态转换。其中条件(M≠MN)表示新过程模板对旧过程模板进行了修改,并不等价于旧过程模型。而(l=ln)保证已经执行过的活动序列在新的过程模型未发生变化。
为防止错误的修改,本文将过程修改看作对过程模板进行增加或删除结点的操作。插入或删除的结点t简化为一个业务结点或一个split-join结构包含的所有结点。简化的目的是简化模型检查和正确性判定。对任意位置、任意结构结点的插入,需要复杂的模型检查与正确性判定算法支持,而这不是本文研究内容。
算法1:流程模板插入结点的算法
输入:过程模板PD,结点属性Map<String,String>property
输出:过程模板PD’
步骤:
(1)AddTask(int nodeId,Map<String,String>property)
//动态添加业务节点,nodeId为当前节点的Id,property为要添加的节点的属性。
(2)读取当前绑定的流程模板信息;根据NodeId找到当前正在运行的节点;根据当前运行节点找到其下一个节点的Id,将其赋给NextId变量。
(3)调用addElement 函数生成一个新节点,并将Property信息赋给该节点的各个属性。同时将NextId赋值给该节点的孩子节点Transition中的to属性。
(4)将步骤(2)中获得的节点的孩子节点Transition的属性赋值为步骤(3)中新生成的节点的Id。
(5)返回修改后的流程模板信息。
(6)根据修改后的流程模板信息生成新的流程模板PD’,将新的流程模板的版本加上1,同时将新的流程模板发布到数据库中。
(7)向正在运行的流程实例发送版本更新信息。
假设A 的转出连接弧指向B,即A、B处于顺序关系。在A、B两结点之间插入一个新结点C 的工作包括:记录A 的转出连接弧(A 结点的Transition属性);修改C 的转出连接弧等于A 的转出连接弧;修改A 的转出连接弧指向C。删除结点的操作与之相类似,假设结点A、B、C 处于顺序关系,删除B结点的操作即是将A 的转出连接弧指向B的转出连接弧的过程。
算法1是LWDWE中所使用的插入结点的昝。限于篇幅,本文略去了删除结点的算法。
在一个过程实例执行时,用户可动态修改该本实例的执行。这种修改可以是增加或删除一个业务结点、修改某个结点的属性等。LWDWE 中,这些修改的实现通过将过程模板复制到本实例中,并切断模板与实例之间的联系来实现。即只允许用户的操作对本过程实例起作用,而屏蔽掉它对过程模板的影响。在一个动态修改过的过程实例完成后,用户也可选择 “升级”操作,从该实例中抽取过程模板并发布出去,供以后的过程实例调用。
本节给出一个简单的请假系统的应用案列来验证引擎的功能,公司请假的一般流程如下:①职员填写请假单,提供名字、请假天数和请假原因等信息。②经理对请假信息进行审批,若请假小于等于3 天,直接给出审批结果,准假或不准假。若请假大于3天,则转到下一步骤,由老板进行审批。③老板给出审批结论,准假或不准假。图4给出使用本系统生成的请假工作流的图形表示。图中有一个分支结点,依据请假天数分两种情况处理。
图4 公司请假流程
当一个实例开始运行时,LWDWE 从过程模型生成请假实例的执行模板。但在执行过程中,可灵活改变工作流实例的处理过程。假设职员1提交请假申请,而且请假天数小于等于3天。则职员提交请假申请后,系统为经理生成工作任务。如图5所示,经理登录系统后看到1个请假实例和一个待办任务。此时经理可修改流程实例,添加新的任务节点。如果经理增加任务结点 “总监审批”,则总监登录系统后,可看到该流程实例及其待办任务,且系统中流程定义TestWorkflow 增加一个新版本的定义,如图6所示。此时流程实例2流转到 “总监审批”节点,实现了流程实例在运行期间的动态修改流程模板并迁移的功能。
本文设计并实现了一种动态轻量级工作流引擎LWDWE。在架构方面,使用总线型的引擎架构;在工作流模型上,给出了一种工作流实现模型和节点的调度机制。对动态修改策略进行改进并支持流程实例的动态修改。论文首先给出系统支持的工作流模型和引擎调度机制,给出引擎的架构及关键实现算法,并通过实例证明了该引擎的可用性。
图5 经理审批阶段的主界面
图6 总监审批的主界面
本论文仅实现了对动态工作流的支持,未深入考虑动态流程的正确性问题,设计并实现流程模型及实例的正确性验证算法是本作者下一步的工作。
[1]Fang Ru,Zou Zhile,Stratan C,et al.Dynamic support for BPEL process instance adaptation [C]//Hawaii,USA:Proceeding of service Computing,2008:327-334.
[2]Zeng Jin,Huai Jinpeng,Sun Hailong,et al.LiveMig:An approach to live instance migration in composite service evolution [C]//IEEE International Conference on Web Services,2009:679-686.
[3]ZENG Jin,SUN Hailong,LIU Xudong,et al.Dynamic evo- lution mechanism for trustworthy software based on service composition [J].Journal of Software,2010,21 (2):261-276 (in Chinese).[曾晋,孙海龙,刘旭东,等.基于服务组合的可信软件动态演化机制 [J].软件学报,2010,21 (2):261-276.]
[4]SONG Wei,MA Xiaoxing,HU Hao,et al.Dynamic evolution of processes in process-aware information system [J].Journal of Software,2011,22 (3):417-438 (in Chinese).[宋巍,马晓星,胡昊,等.过程感知信息系统中过程的动态演化过程感知信息系统中过程的动态演化 [J].软件学报,2011,22 (3):417-438.]
[5]SONG Wei,MA Xiaoxing,LU Jian.Instance migration in dynamic evolution of web service compositions[J].Chinese Journal of Computers,2009,32 (9):1816-1831 (in Chinese).[宋巍,马晓星,吕建.Web服务组合动态演化的实例可迁移性 [J].计算机学报,2009,32 (9):1816-1831.]
[6]XU Gang,SONG Wei,HU Hao,et al.Design and implementation of process system supporting process dynamic updating [J].Computer Sciences,2012,39 (11A):434-439 (in Chinese).[徐刚,宋巍,胡昊,等.一种支持过程动态更新的过程系统设计与实现 [J].计算机科学,2012,39 (11A):434-439.]
[7]Baird R,Jorgenson N,Gamble R.Self-adapting workflow reconfiguration [J].Journal of Systems and Software,2011,84 (3):510-524.
[8]ZHAN Zhen.The research and implementation of dynamic workflow technology based on.net[D].Wuhan:Huazhong University of Science and Technology,2012 (in Chinese).[詹振.基于.NET 的动态工作流技术的研究与实现[D].武汉:华中科技大学,2012.]
[9]Yu G,Zhao P,Di L,et al.BPELPower—A BPEL execution engine for geospatial web services[J].Computers & Geosciences 2012,47:87-101.
[10]Romain R,Vitae M L,Vitae S R.OpenMOLE,a workflow engine specifically tailored for the distributed exploration of simulation models [J].Future Generation Computer Systems,2013,29 (8):1981-1990.