当前位置: 首页 > 工具软件 > Snaker > 使用案例 >

Activiti&UFLO2&Snaker流程引擎对比分析

赏夕
2023-12-01

Activiti&UFLO2&Snaker流程引擎对比分析

一、工作流引擎简介以及三种引擎整体介绍

1.Activiti

activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。

ctiviti.cfg.xml文件为核心配置文件,该配置文件集成在Spring的IOC容器当中,可以产生ProcessEngineConfiguration对象,这个对象就是流程引擎的配置对象,ProcessEngine对象则为流程引擎对象,该对象是工作流业务系统的核心,所有的业务操作都是由这个对象所派生出来的对象实现。
Activiti引擎提供了七大Service接口,均通过ProcessEngine获取,并且支持链式API编程风格。

activiti.cfg.xml
ProcessEngineConfiguration
ProcessEngine
RepositoryService
IdentityService
RuntimeService
TaskService
FormSerivice
HistoryService
ManagementService
2.UFLO2

是锐道自主研发的一款开源的工作流引擎,架构于Spring、Hibernate之上,提供了uflo-core、uflo-console两个核心模块:

​ uflo-core模块提供了流程流转的核心控制功能;

​ uflo-console模块是一个基于WEB表现层的分支项目,提供了基于WEB的流程模版设计器,这个项目中提供了基于网页的流程模版 控制与测试中心、提供了用户待办页面及节假日配置等流程引擎运行的辅助模块;

3.Snaker

Snaker是一个基于Java的轻量级工作流引擎,适用于企业应用中常见的业务流程。本着轻量、简单、灵巧理念设计,定位于简单集成,多环境支持,,可扩展性很强;

二、异同点分析对比

1、运行环境
项目ActivitiUFLO2Snaker
数据库Mysql5+,h2, oracle, postgres, mssql, db2mysql,oraclemysql,oracle,db2, h2 ,mssql,postgres等
框架Mybatis(默认依赖)、Hibernate、spring,SpringMVC,Struts2spring,SpringMVC,HibernateSpring、Jfinal、springmvc、Hibernate3or4、struts2、Mybatis

[^UFLO2 JDK 版本]: 默认使用Hibernate5,对应编译版本JDK1.8,支持替换为Hibernate3,4 ,对应JDK1.7
[^UFLO2 数据库 版本]: 官方文档未指定数据库,实测demo 在mysql5.7正常运行,查阅其他文档orcale 也正常支持,其他数据库未知

2.流程页面替换

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写的,比较老;

3.整合权限

Activiti:引擎配套设计了包括user、Group的Identify模块,同步项目业务数据时主要有以下三种方法:

​ 1、调用IdentifyService接口完成用户同步;

​ 2、覆盖重写IdentifyService接口的实现;

​ 3、创建用户表同名视图,使用自己的平台或框架提供的API

UFLO2:

剥离了权限集成,可以与业务项目中的权限集成,但是集成权限框架后续注意一些URL 的放行,否则流程将出现错误,这些URL官方文档中已经给出提示

Snaker:

剥离了用户权限,审批本身未集成用户角色,权限框架可以与业务项目集成;

snaker-web项目基于SpringMVC、Spring3、Hibernate3、Shiro、Snaker搭建的基础演示应用,可以作为参考

4.学习成本
项目ActivitiUFLO2Snaker
上手难易程度相对简单
网上资源资源丰富,视屏教程,文献丰富除官方文档外资料较少除官方文档外资源较少
官方文档英文文档中文文档,代码中注释详细中文文档,代码中注释详细
5.性能

Activiti:支持单机或集群部署,支持缓存保存在redis,系统,sping-cache等

UFLO2:支持单机或集群部署,对于集群部署,官方文档提供了说明,我们只需要替换UFLO中默认基于内存的缓存服务(自定义CacheService接口实现类,并将其配置到Spring中即可),文档提供了一个连接Redis服务器的CacheService接口实现 类源码;另一件就是配置一些集群参数,官方文档以Eclipse为例也做了实例说明;

Snaker:设计流程定义服务时,通过实现缓存管理器包装接口来实现流程定义的缓存。默认使用内存缓存方式,同时也支持ehcache缓存框架。只需要依赖snaker-ehcache包即可,最新的Spring-boot版本支持redis缓存;

6.流程设计器

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文件,因为设计器需要页面来编辑和展现。

7.流程定义文件储存位置

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字段)

8.事务支持

Activiti:

如果项目整合spring框架,将Activiti放到Spring容器中将事务交给spring管理即可

非spring项目只需要将自己业务和activiti共用同一个事务即可实现事务控制;

UFLO2:

使用spring 的SessionFactory及TransactionManager即可将事务交由spring

Snaker:

API方式的调用流程事务是由snaker自身管理,保证每次api调用事务的正确性,如果整合spring,需要配置服务、事务,可以将事务交给spring管理整合到业务项目事务中。可以参考snaker-web项目

9.主要服务对比

Activiti

service接口释义
RepositoryService流程仓库service,用于管理流程仓库,如部署、删除、读取流程资源
IdentityService身份service,可以管理和查询用户、组之间的关系
RuntimeService运行时service,处理所有正在运行状态的流程实例、任务
TaskService任务service,用于管理、查询任务,如签收、办理、指派等
FormSerivice表单service,用于读取和流程、任务相关的表单数据
HistoryService历史service,查询所有历史数据,如流程实例、任务、活动、附件等
ManagementService引擎管理service,查询引擎配置、数据库、作业等

UFLO2

名称释义
CacheService缓存服务
CalendarService日历服务
DefaultMemoryCacheService默认内存缓存服务
HistoryService历史服务
IdentityService自增服务(大部分都是关于用户、部门、角色、组织的查询)
MapAdapterMap适配器:大部分都是Map处理相关的静态方法
ProcessInterceptor过程拦截
ProcessService流程服务:流程模板、流程实例的处理
RestService复位服务
SchedulerService调度服务:调度、提醒
TaskService任务服务

Snaker

名称释义
IProcessService流程模型服务。提供的功能:保存流程定义、根据流程模型文件部署流程、根据主键ID获取流程定义对象
IOrderService流程实例服务。提供的功能:根据流程定义创建流程实例、添加全局变量、完成流程实例、终止流程实例
ITaskService任务服务。提供的功能:创建任务、添加删除参与者、完成任务、撤回任务、回退任务、提取任务
IQueryService流程相关的查询服务。提供的功能:分页查询流程实例、任务、历史流程实例、任务参与者
IManagerService管理服务接口,用于流程管理控制服务委托管理时限控制
10.数据库表对比
引擎名数据库创建
Activiti创建流程引擎ProcessEngine对象时自动生成25张数据库表
UFLO17张表,手动创建数据库执行提供的数据库脚本
Snaker9张表,手动创建数据库执行提供的数库脚本

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;

Activit:

优点:

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.对比另外两个引擎较笨重,是一款比较重量级的流程引擎

UFLO2:

优点:

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.除了官方文档提供的实例代码外,网上基本找不到其他实例代码

Snaker:

优点:

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版本,目前已停止更新维护

 类似资料: