activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
ctiviti.cfg.xml文件为核心配置文件,该配置文件集成在Spring的IOC容器当中,可以产生ProcessEngineConfiguration对象,这个对象就是流程引擎的配置对象,ProcessEngine对象则为流程引擎对象,该对象是工作流业务系统的核心,所有的业务操作都是由这个对象所派生出来的对象实现。
Activiti引擎提供了七大Service接口,均通过ProcessEngine获取,并且支持链式API编程风格。
是锐道自主研发的一款开源的工作流引擎,架构于Spring、Hibernate之上,提供了uflo-core、uflo-console两个核心模块:
uflo-core模块提供了流程流转的核心控制功能;
uflo-console模块是一个基于WEB表现层的分支项目,提供了基于WEB的流程模版设计器,这个项目中提供了基于网页的流程模版 控制与测试中心、提供了用户待办页面及节假日配置等流程引擎运行的辅助模块;
Snaker是一个基于Java的轻量级工作流引擎,适用于企业应用中常见的业务流程。本着轻量、简单、灵巧理念设计,定位于简单集成,多环境支持,,可扩展性很强;
项目 | Activiti | UFLO2 | Snaker |
---|---|---|---|
数据库 | Mysql5+,h2, oracle, postgres, mssql, db2 | mysql,oracle | mysql,oracle,db2, h2 ,mssql,postgres等 |
框架 | Mybatis(默认依赖)、Hibernate、spring,SpringMVC,Struts2 | spring,SpringMVC,Hibernate | Spring、Jfinal、springmvc、Hibernate3or4、struts2、Mybatis |
[^UFLO2 JDK 版本]: 默认使用Hibernate5,对应编译版本JDK1.8,支持替换为Hibernate3,4 ,对应JDK1.7
[^UFLO2 数据库 版本]: 官方文档未指定数据库,实测demo 在mysql5.7正常运行,查阅其他文档orcale 也正常支持,其他数据库未知
Activiti:提供一系列的可供外部调用的API接口,对于我们的业务系统而言,调用提供的API,就可以实现业务流程的开启、任务的开始与完成等操作。所以activiti没有与任何前端UI绑定,支持替换前端页面,支持vue element ui等框架,适合web应用,微信、手机应用管理端及服务端
EFLO2:类似Activiti调用API即可实现业务流程的一系列操作,所以也支持自定义前端页面,官方文档为我们提供了几个JS方法如下,提供了一个自定义审批页面创建的视频实例作为参考;对于流程模板的页面显示效果,uflo-console模块提供了API用于修改流程图的显示效果
#处理任务的业务页面在完成任务后关闭弹出窗口的方法
执行JS:window.parent.dialogEvent.eventEmitter.emit(window.parent.dialogEvent.CLOSE_DIALOG)
#在自定义处理任务页面里刷新待办任务列表方法
执行JS:window.parent.todoEvent.eventEmitter.emit(window.parent.todoEvent.RELOAD_TODO);
#在自定义处理任务页面里刷新待领取任务列表方法
执行JS:window.parent.todoEvent.eventEmitter.emit(window.parent.todoEvent.RELOAD_CLIAM);
#在自定义任务处理页面里刷新历史任务列表方法
执行JS:window.parent.todoEvent.eventEmitter.emit(window.parent.todoEvent.RELOAD_HISTORY);
Snaker:支持自定义前端页面,官方提供的Demo 项目 snaker-web 代码是用JSP写的,比较老;
Activiti:引擎配套设计了包括user、Group的Identify模块,同步项目业务数据时主要有以下三种方法:
1、调用IdentifyService接口完成用户同步;
2、覆盖重写IdentifyService接口的实现;
3、创建用户表同名视图,使用自己的平台或框架提供的API
UFLO2:
剥离了权限集成,可以与业务项目中的权限集成,但是集成权限框架后续注意一些URL 的放行,否则流程将出现错误,这些URL官方文档中已经给出提示
Snaker:
剥离了用户权限,审批本身未集成用户角色,权限框架可以与业务项目集成;
snaker-web项目基于SpringMVC、Spring3、Hibernate3、Shiro、Snaker搭建的基础演示应用,可以作为参考
项目 | Activiti | UFLO2 | Snaker |
---|---|---|---|
上手难易程度 | 中 | 中 | 相对简单 |
网上资源 | 资源丰富,视屏教程,文献丰富 | 除官方文档外资料较少 | 除官方文档外资源较少 |
官方文档 | 英文文档 | 中文文档,代码中注释详细 | 中文文档,代码中注释详细 |
Activiti:支持单机或集群部署,支持缓存保存在redis,系统,sping-cache等
UFLO2:支持单机或集群部署,对于集群部署,官方文档提供了说明,我们只需要替换UFLO中默认基于内存的缓存服务(自定义CacheService接口实现类,并将其配置到Spring中即可),文档提供了一个连接Redis服务器的CacheService接口实现 类源码;另一件就是配置一些集群参数,官方文档以Eclipse为例也做了实例说明;
Snaker:设计流程定义服务时,通过实现缓存管理器包装接口来实现流程定义的缓存。默认使用内存缓存方式,同时也支持ehcache缓存框架。只需要依赖snaker-ehcache包即可,最新的Spring-boot版本支持redis缓存;
Activiti:开发工具支持IDEA&Eclipse插件,同时支持网页版设计器Activiti Modeler,只需要将war包部署Tomcat即可运行网页版流程设计器;(Activiti Modeler是基于Signavio的,所以浏览器方面就有限制了,不支持IE浏览器)
UFLO2:提供网页版的流程设计器,启动应用,打开浏览器, 浏览http://localhost:8080/uflo-test/uflo/designer这个URL,就可以看到流程模版设计器,此外提供eclipse版的流程设计器插件,目前未找到IDEA插件。
Snaker:提供了网页版流程设计器,只需要创建数据库后将snaker-web.war包部署Tomcat即可运行网页版流程设计器,web设计器是基于myflow开发的,使用的技术为raphael.js ,此外提供eclipse版的流程设计器插件,目前未找到IDEA插件。
对于web设计器,代码位于snaker-web项目的\snaker-web\src\main\webapp\styles\js\snaker目录下;
如果已有的项目需要集成web版本的设计器,主要是copy这个目录,并且参考\snaker-web\src\main\webapp\WEB-INF\content\snaker目录下process开头的jsp文件,因为设计器需要页面来编辑和展现。
Activiti:流程部署时默认以二进制的形式储存在自带的资源表act_ge_bytearray中,并提供下载API
UFLO2:支持将设计的流程模板文件存储到文件系统、数据库、云端等位置,默认以xml的形式储存在/WEB-INF/processfiles目录下,提供接口允许开发者自定义存储方式,比如我们可以自己创建数据库表,实现ProcessProvider接口重写以下方法将模板文件储存到数据库
public interface ProcessProvider {
/**根据文件名查询模板文件
* @param fileName
* @return
*/
InputStream loadProcess(String fileName);
/**查询所有流程模板文件
* @return
*/
List<ProcessFile> loadAllProcesses();
/**保存模板文件
* @param fileName
* @param content
*/
void saveProcess(String fileName,String content);
/**删除模板文件
* @param fileName
*/
void deleteProcess(String fileName);
/**存储方式名称
* @return
*/
String getName();
/**存储方式前缀
* @return
*/
String getPrefix();
/**根据前缀判断是否该存储方式
* @param fileName
* @return
*/
boolean support(String fileName);
/**是否禁用该存储方式,默认false
* @return
*/
boolean isDisabled();
}
Snaker:流程定义默认以xml的形式保存至数据库中(wf_process的content字段)
Activiti:
如果项目整合spring框架,将Activiti放到Spring容器中将事务交给spring管理即可
非spring项目只需要将自己业务和activiti共用同一个事务即可实现事务控制;
UFLO2:
使用spring 的SessionFactory及TransactionManager即可将事务交由spring
Snaker:
API方式的调用流程事务是由snaker自身管理,保证每次api调用事务的正确性,如果整合spring,需要配置服务、事务,可以将事务交给spring管理整合到业务项目事务中。可以参考snaker-web项目
Activiti
service接口 | 释义 |
---|---|
RepositoryService | 流程仓库service,用于管理流程仓库,如部署、删除、读取流程资源 |
IdentityService | 身份service,可以管理和查询用户、组之间的关系 |
RuntimeService | 运行时service,处理所有正在运行状态的流程实例、任务 |
TaskService | 任务service,用于管理、查询任务,如签收、办理、指派等 |
FormSerivice | 表单service,用于读取和流程、任务相关的表单数据 |
HistoryService | 历史service,查询所有历史数据,如流程实例、任务、活动、附件等 |
ManagementService | 引擎管理service,查询引擎配置、数据库、作业等 |
UFLO2
名称 | 释义 |
---|---|
CacheService | 缓存服务 |
CalendarService | 日历服务 |
DefaultMemoryCacheService | 默认内存缓存服务 |
HistoryService | 历史服务 |
IdentityService | 自增服务(大部分都是关于用户、部门、角色、组织的查询) |
MapAdapter | Map适配器:大部分都是Map处理相关的静态方法 |
ProcessInterceptor | 过程拦截 |
ProcessService | 流程服务:流程模板、流程实例的处理 |
RestService | 复位服务 |
SchedulerService | 调度服务:调度、提醒 |
TaskService | 任务服务 |
Snaker
名称 | 释义 |
---|---|
IProcessService | 流程模型服务。提供的功能:保存流程定义、根据流程模型文件部署流程、根据主键ID获取流程定义对象 |
IOrderService | 流程实例服务。提供的功能:根据流程定义创建流程实例、添加全局变量、完成流程实例、终止流程实例 |
ITaskService | 任务服务。提供的功能:创建任务、添加删除参与者、完成任务、撤回任务、回退任务、提取任务 |
IQueryService | 流程相关的查询服务。提供的功能:分页查询流程实例、任务、历史流程实例、任务参与者 |
IManagerService | 管理服务接口,用于流程管理控制服务委托管理时限控制 |
引擎名 | 数据库创建 |
---|---|
Activiti | 创建流程引擎ProcessEngine对象时自动生成25张数据库表 |
UFLO | 17张表,手动创建数据库执行提供的数据库脚本 |
Snaker | 9张表,手动创建数据库执行提供的数库脚本 |
Activiti数据库分析:
数据库表结构的命名规则:ACT_开头,用于和业务表区分开;
ACT_RE开头:流程定义和流程资源表,比如流程的定义信息
ACT_RU开头:运行时数据表,储存运行时流程实例,任务,变量
ACT_HI开头:历史数据表,记录流程执行的记录
ACT_GE开头:基础数据表,存放通用资源信息,比如各个流程的bpmn,png 文件
UFLO2数据库表分析:
官方文档未做表结构说明,共17张表,表命名以uflo_开头与业务表区分;
uflo_blob:流程定义文件储存表,二进制格式
uflo_calender:日历表,
uflo_his_:历史数据表
uflo_process_:流程实例和流程定义表
uflo_variable:流程变量表
uflo_task_:任务表,任务参人与表,任务指定人表,任务提醒表
uflo_job_heartbeat:流程存活时间表
Snaker数据库表分析:
表名称 | 描述 |
---|---|
wf_process | 流程定义表 |
wf_order | 活动实例表 |
wf_task | 活动任务表 |
wf_task_actor | 活动任务参与者表 |
wf_hist_order | 历史实例表 |
wf_hist_task | 历史任务表 |
wf_hist_task_actor | 历史任务参与者表 |
wf_surrogate | 委托代理管理表 |
wf_cc_order | 抄送实例表 |
三个流程引擎API操作大同小异,都是获取流程引擎对象,通过流程引擎调用服务对象再调用方法,或者直接调用API
都提供根据流程id,流程名称,流程版本等CRUD流程的API,Activiti相对更丰富一些;
都支持转派、撤回、驳回、自由流程、组任务、委派代理、子流程等等功能,都支持传递流程变量;
都支持同名流程多版本同时运行
与实际业务流程绑定的方法也基本相同,都是执行流程时多传递一个业务表的主键id;
优点:
1.支持IDEA流程设计器;
2.功能强大,满足各种复杂的业务场景流程需求;
3.依赖的jar包相对较少;
4.表结构设计方面遵循运行时数据和历史数据的分离,这样的设计可以快速读取运行时数据,仅当需要查询历史数据时再从专门的历史数据表中读出(每个任务被处理后就会被移动到历史记录表,提高运行数据表的查询效率)
5.支持启动web容器的时候自动把指定路径的流程资源文件部署到Activiti DB上
6.可参考的流程配置的web界面:https://alfresco.com.cn/cn/cos/process-services
7.采用了PVM,性能好速度快,支持BPMN2.0规范以外的流程格式
8.流程引擎自身支持form,也支持自定义form
9.网络资源较为丰富
缺点:
1.表结构复杂,继承了用户权限表,需要完成用户同步
2.核心代码量大,逻辑较为复杂,二次开发难度较大
3.持久化未遵循JPA规范
4.对比另外两个引擎较笨重,是一款比较重量级的流程引擎
优点:
1.提供的web 设计器相对比较好用,操作方便界面美观,同时提供了流程图样式设计的api说明,比如流程图中经过节点的颜色、字体、字体大小、边框色、连线颜色、是否显示节点经过次数等通过属性文件中进行自定义,下图截取了部分内容:
属性名 | 数据类型 | 默认值 | 描述 |
---|---|---|---|
uflo.diagram.showTime | 布尔 | TRUE | 是否显示节点流转次数 |
uflo.diagram.passedNodeBgcolor | 字符串 | 245,245,245 | 一个RGB数值,用来决定经过的节点的背景颜色 |
uflo.diagram.passedNodeFontColor | 字符串 | 150,150,150 | 一个RGB数值,用来决定经过的节点的字体颜色 |
uflo.diagram.passedNodeFontSize | 数字 | 13 | 定义经过节点字体大小 |
uflo.diagram.passedNodeBorderColor | 字符串 | 200,200,200 | 一个RGB数值,用来决定经过的节点的边框颜色 |
uflo.diagram.passedConnectionColor | 字符串 | 200,200,200 | 一个RGB数值,用来决定经过的节点之间连线的颜色 |
uflo.diagram.passedConnectionFontSize | 数字 | 12 | 定义经过节点之间连线文字大小 |
uflo.diagram.connectionColor | 字符串 | 0,69,123 | 一个RGB数值,定义未经过节点间连线颜色 |
uflo.diagram.connectionFontColor | 字符串 | 0,69,123 | 一个RGB数值,定义未经过节点间连线上文字颜色 |
uflo.diagram.connectionFontSize | 数字 | 12 | 定义未经过节点之间连线文字大小 |
uflo.diagram.nodeBgcolor | 字符串 | 220,220,220 | 一个RGB数值,定义未经过节点的背景颜色 |
uflo.diagram.nodeFontColor | 字符串 | 18,42,136 | 一个RGB数值,定义未经过节点的文字颜色 |
uflo.diagram.nodeFontSize | 数字 | 13 | 定义未经过节点的文字大小 |
… | … | … | … |
2.提供了嵌入式运行模式及独立服务运行模式。
嵌入式模式是指将UFLO相关Jar直接放置到我们的项目当中,业务模块直接调用UFLO相关Service API即可实现业务流程的运转,这种模式的优点是小巧灵活,与项目融为一体,部署起来简单方便。
独立运行模式是指将UFLO引擎独立部署为一个WEB应用,我们的应用通过调用UFLO提供的RESTFUL风格的Service URL实现业务流程的运转。
独立服务模式的优势在于因为其作为一个独立部署的WEB服务,它可以很好的支持集群.综合以上所述,如果您的应用不采用集群模式部署的话,那么可以使用嵌入式方式使用UFLO,否则要使用独立服务模式。
无论采用哪种运行模式,开发人员只需要调用UFLO Client模块提供的统一的客户端API,通过属性开关即可实现UFLO项目嵌入式运行与独立服务运行模式的快速转换
3.官方文档提供了集群部署方式,可以很好的支持集群部署
缺点:
1.不支持Mybatis;
2.流程模板文件默认以xml形式储存在服务器本地,未入库,要实现入库,需要己重写代码;
3.流程设计器不支持IDEA插件
4.剥离了用户权限
5.官方文档未对表结构做具体说明
6.架构与Spring 和hibernate之上不能修改
8.除了官方文档提供的实例代码外,网上基本找不到其他实例代码
优点:
1.只需要9张表,即可开始业务流程的驱动使用,主要针对中小型项目需要增加工作流特性的系统;相比于UFLO2、Activti十几张以上表,上手和使用的难度很低。(只需要根据实际的项目环境配置snaker.properties/snaker.xml两个文件即可)
2.核心代码少,源码只有7000多行,设计、编写非常规范,易懂、易改造。对于学习工作流原理或者二次开发,都很友好;
3.除了提供的常用功能API,支持拓展支持一些原生SQL语句的查询服务
//根据类型T、Sql语句、参数查询单个对象
public <T> T nativeQueryObject(Class<T> T, String sql, Object... args);
//根据类型T、Sql语句、参数查询列表对象
public <T> List<T> nativeQueryList(Class<T> T, String sql, Object... args);
//根据类型T、Sql语句、参数分页查询列表对象
public <T> List<T> nativeQueryList(Page<T> page, Class<T> T, String sql, Object... args);
4.业务流程如果简单,可以直接把业务数据存在流程实例的变量中(数据以JSON形式保存在流程实例和任务表中的variable 字段中,长度默认varchar(2000)),但这样也会增加流程引擎和业务数据的耦合;(建议还是在业务表中增加order_id、task_id 来支持业务流引擎的集成)
5.对外提供了可扩展的接口,支持流程设计器,节点自定义,属性自定义,表单自定义
缺点:
1.剥离了权限角色相关依赖,实际导入系统时需要根据需求自己添加权限相关内容
2.受限于轻量级限制,支持的业务场景不够丰富;
3.流程设计器不支持IDEA插件
4.稳定版为2.4版本,支持的hibernate最高直到4版本,目前已停止更新维护