前言
设备完整性系统一期工程终于告于段落,因此想趁这段时间总结一下此项目中的核心–工作流引擎。当初考虑到甲方业务流程复杂、审批手续多等特点于是讨论方案定下采用工作流引擎,至今想来确实是一个明智的选择。考虑到甲方需求复杂多变,我们团队就自主研发了一款灵活、高可维护性以及扩展性的工作流引擎。下面就来的总结一下。
工作流引擎概要
工作流软件,办公文档的流转,经常被誉为无纸办公的一部分。而工作流引擎则是其中的核心,它可以处理涉及流程事务,降低交付成本,缩短交付周期,提高工作效率。例如,以往工作中纸质的请假,审批条,通过电子文稿的方式在员工之间流转,从而提高办公效率。
工作流引擎也就是标准中的工作流机,工作流执行服务器是使用一个或多个工作流机,为过程实例和活动提供运行环境,负责解释和激活过程定义,与过程所需的外部资源进行交互。在WfMc的标准中的定义为:“由一个或多个工作流机构成的软件服务器,用来创建、管理、执行工作流实例。应用程序可能会通过WAPI来与这个服务交互”。一个工作流机负责执行服务器中的部分(或者全部)运行控制环境。在标准中的定义为:“为工作流实例提供运行时期的执行环境的软件服务器或引擎。”。
工作流引擎的职能:
- 解释过程定义
- 控制过程实例—创建、激活、挂起、终止等
为过程的活动导航,可能要包含顺序或者平行的操作、最后时间期限、对工作流相关数据进行解释
参与者签名和退出
- 确定任务项目,实现用户意图;提供接口,支持用户交互
- 维护工作流控制数据和工作流相关数据,在应用程序间或者用户间传递工作流相关数据
- 提供调用外部程序的接口,连接所有工作流相关数据
- 提供控制、管理和审查功能
主流工作流引擎介绍
市面上主流的工作流引擎主要有Shark、Osworkflow、Jbpm、Apache ODE、Bonita、及目前最新的Activiti。下面简单介绍一下。
Shark
Shark是一个完全基于WFMC和OMG规范的工作流引擎。Shark的流程定义语言是XPDL,XPDL的两个最重要的概念是Process和Activity。XPDL中的Activity是基于UML1.x中的活动图的概念。活动图天生的适于工作流程建模,它相对于状态图的一个最大的优点是容易做并发线程的分叉控制,这些并发线程可以同时执行也可以顺序执行;它还有一个优点是有泳道的概念,可以控制工作流引擎中的任务的产生。
参考:
http://www.oschina.net/p/shark/
http://shark.ow2.org/doc/1.1/index.html
Osworkflow
Osworkflow是完全用java语言编写的开放源代码的工作流引擎,具有显著的灵活性及完全面向有技术背景的用户的特点。用户可以根据自身的需求利用这款开源软件设计简单或是复杂的工作流。通过使用,用户就可以把工作中心放在业务和规则的定义上,而不需通过硬编码的方式实现一个Petri网或是一个有穷自动机。用户可以以最小的代价把osworkflow整合到自己的程序中来。(百度百科)
Osworkflow极其灵活性。
底层工作流实现
基于有限状态机
参考:
《Osworkflow开发手册》
Jbpm
JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。jBPM是公开源代码项目,使用它要遵循 ASL(Apache License Version 2.0)和EULA(JBoss End User License Agreement)协议。jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBossjBPM。
1.jBPM是一款基于LGPL开源协议的开源工作流产品,它没有采用BPEL或WFMC标准去实现流程引擎;jBPM采用的是一套自有标准,一种轻量级的XML结构的流程描述语言JPDL, JPDL是jBPM Process Definition Language的缩写,相比WFMC和BPEL两种标准而言,JPDL语言更加简单,也更容易读懂。
2.jBPM提供了基于Eclipse的流程设计器。
3.以WEB应用的形式提供了对流程的管理与控制。
4.因为jBPM采用Hibernate对流程数据进行持久化,所以jBPM可以运行于任意数据库之上。
5.jBPM的运行模式有两种:独立模式、嵌入式模式。
参考:
http://docs.jboss.org/jbpm/v6.3/userguide/
Apache ODE
Apache ODE (Orchestration Director Engine) 支持WS-BPEL 2.0流程建模标准 ,支持BPEL、Xforms、WebService作为外部接口标准。框架比较灵活。ODE BPEL编译器、ODE BPEL运行时、ODE数据访问对象(DAOs)、ODE集成层(ILs)和用户工具之间耦合度低。
1.同时支持WS-BPEL 2.0 OASIS 标准和传统的BPEL4WS 1.1供应商规范。
2.支持2个通信层:一个基于Axis2 (Web Services http transport),另一个基于JBI标准 (using ServiceMix)。
3.支持HTTP WSDL绑定,允许REST样式的webservice调用。
4.为外部流程变量映射到内部的数据表提供可能。
5.高层次的API可以将任何通信层集成到引擎核心。
6.流程热部署。
7.BPEL 的编译方法在命令行或部署上提供了详细的分析和验证。
8.为流程提供实例和消息的管理接口。
Bonita Bonita
是一个符合WfMC规范、灵活的协同工作流系统。 对于各种动作如流程概念建模、定义、实例化、流程控制和用户交互等提供了全面的集成图形工具。 100% 基于浏览器、使用SOAP和XML数据绑定技术的Web Services封装了已有的工作流业务方法并将它们以基于J2EE的Web Service形式发布。基于活动预测模型的第三代工作流引擎。
1.具有零编码方法。
2.对于没有提供连接器的应用,需要自己写连接器。
3.免费版不支持LDAP 或者 Active Directory Sync
4.不是商业IT对其的,即不能既能够提供给商业人员使用,又提供给专业人员使用,提供了Bonita Studio,但是需要专业技术人员使用。
5.只适用微小简单的业务流程的管理工具,不够灵活。
参考:
http://stackoverflow.com/questions/7279329/bonitasoft-bpm-vs-jbpm-vs-activiti
Activiti
应该是最新的工作流引擎,Activiti是一个独立运作和经营的开源项目品牌,并将独立于Alfresco开源ECM系统运行。 Activiti将是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,以便这个项目可以广泛被使用,同时促进Activiti BPM引擎和BPMN 2.0的匹配,该项目现正由OMG通过标准审定。 加入Alfresco Activiti项目的是VMware的SpringSource分支,Alfresco的计划把该项目提交给Apache基础架构,希望吸引更多方面的BPM专家和促进BPM的创新。
1.轻量级。
2.Apache license下的开源项目。
3.能够运行在服务器,集群,或者云上的任何java应用程序上。
4.能够集成在Spring上。
5.支持BPMN2.0规范。
6.可以发布设计好的流程定义。
7.通过api进行流程调度
参考:
http://www.activiti.org/userguide/index.html
自主研发工作流引擎介绍
为了提高本项目组开发中、大型企业信息管理系统的效率、降低此类项目的后期维护复杂度,本项目组织开发了一个针对中、大型企业信息管理系统的一个工作流引擎开发平台。
本工作流引擎以有限状态机为基本模型,结合消息泵、事务管理与调度、数据存储等机制实现了对企业日常工作业务的全流程、全要素的管理,并为开发人员提供了一个可视化工作流定制工具,允许开发人员对包括业务逻辑、权限控制、数据归档等功能进行可视化定制。
在此工作流引擎开发平台之上,开发人员可从复杂、多变的业务流程设计工作中解放出来,降低重复性编码量、提高开发效率。该工作流引擎开发平台最终成为石化公司设备完整行管理系统及基于Web的武汉石化企业DRBPM系统的开发平台。
工作流引擎的整体设计
工作流引擎分为三层结构,分别是FlowEngine、FlowEngine.DAL、FlowEngine.Modals。
其中工作流引擎的核心部分在FlowEngine层中完成,基于改进版的有限状态机模型和消息泵实现了工作流的功能。

核心层–FlowEngine层

在项目中,结合有限状态机的思想,将其具体化成了 事件和 流。由于有限状态机中的所有状态都是相等的,但是为了适应业务的需求,便借鉴了Windows消息处理方式,给事件添加了三种消息(action)分别是before、current、after。而 流则负责事件迁移的方向和条件的判断(并与变量表相关联)。

主要接口:
- 分别是对象实体的接口:定义XML解析及生成方法
- Event类对外提供的接口:定义事件的通用属性和方法
- Flow流接口:主要负责维护事件(Event)之间的联系——状态迁移
事件(Event)
事件的结构图:

其通用方法包括以下几种:
InstFromXmlNode //解析XML
- 1)读取event属性
- 2)读取Actions(before,after,curr)
- 3)读取权限
- 4)读取超时属性
WriteToXmlNode//反解析到XML
- 1)创建Event节点
- 2)设置Event属性
- 3)设置Actions节点
- 4)设置权限
- 5)设置超时
EnterEvent//进入该事件
- 1)UpdateCurrentEvent:更新当前任务到CURR_Mission表
LeaveEvent//离开该事件
- 1)InsertMissionToDB更新Mission表和Param表(record表是在状态迁移结束后写入)
为了实现业务的需求,目前主要定了如下几种事件并且可以按需求继续扩展
- 起始事件
- 结束事件
- 子流程事件
- 定时事件
- 循环事件

流(Flow)
流中定义了若干属性和一个计算表达式的方法:
- destination_event(目标事件)
- expression(表达式)
- source_event(源事件)
- Evaluate :计算流(Flow)表达式的值
Evaluate ()方法是流(Flow)的核心方法,与之配合的方法有将中缀表达式转化成后缀表达式的方法,重写的加法、减法、小于、大于、小于等于、大于等于、与、或、非、不等于等一些计算表达式的方法
权限验证
作为工作流中的关键的一环,权限验证方式几经变换,到现在已经完全成熟。以前老版的权限验证方式是给每一个事件中赋予它一串权限字符串,根据权限字符串在库中进行验证当前用户是否具有权限操作该事件。权限字符串中包含的特征属性有:外部变量(如:当前用户)、专业、部门、角色、设备等。
对应验证权限的方法有:
- FillParams//将参数值填充到查询语句
- CheckAuth //验证权限,返回真假
- GetParams //返回权限认证串中的参数名称
在基础库中数据不多的情况下,这种权限验证方式可以适应系统需求,但是由于甲方的基础库不断增加,如设备由原来的2000多台一下增至10万余台,用户由100余人增至500余人,专业、部门等也自然相应增加,因此原来的逐条验证权限方式已不满足系统需求。
为了满足系统需求,权限验证方式必须做出改变。经过充分的讨论及验证后,决定将注意力由设备转移到用户上来,具体做法是建立一张权限表,将当前所有事件的权限字段放如其中,用户登录时验证权限,即可一次查出该用户所有可操作的事件,极大地提高了系统的效率。
文件归档
在一条工作流处理完后,用户希望将这条工作流中上传过的文件进行归档方便以后查阅,
为了实现这一功能,便在事件定制的时候为上传文件类的变量加上一个变量类型-文件归档,同时在数据库中创建一个针对变量类型为文件归档的变量的视图,通过查询视图可以高效的得到查询结果。

####定时性任务
可以由用户按需自行定义,定时产生任意条数工作流,实现定时性任务的功能。此功能的实质是在定制完成后加载进内存,配合心跳程序,每分钟查询一次,根据定制时为任务指定的corn表达式,到了时间触发,产生工作流。
FlowEngine.DAL层
该层主要为工作流引擎与数据库之间的交互,包含针对定时性任务的一个类和对库中工作流操作的一个类。

job
workflow
FlowEngine.Modals层
该层主要包含工作流引擎中涉及的类,并且通过code-first方式进行数据库迁移,在数据库中建立关系表,对工作流的信息进行记录及归档,方便以后查阅。其中建立的表有工作流定义表、工作流实体表、工作流已完成的任务表、任务的记录表、任务中的变量表、当前任务表和定时作业表。
##总结
以上是对工作流引擎的一些简单的介绍,后续会对可视化定制工作流的工具进行总结。本文为原创文章,转载请与我联系,如有错误地方,谢谢指正。
更多文章:个人网站