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

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

1.Activiti

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

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

#mermaid-svg-2vlrBDFHBcRTocEi .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-2vlrBDFHBcRTocEi .label text{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .node rect,#mermaid-svg-2vlrBDFHBcRTocEi .node circle,#mermaid-svg-2vlrBDFHBcRTocEi .node ellipse,#mermaid-svg-2vlrBDFHBcRTocEi .node polygon,#mermaid-svg-2vlrBDFHBcRTocEi .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-2vlrBDFHBcRTocEi .node .label{text-align:center;fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .node.clickable{cursor:pointer}#mermaid-svg-2vlrBDFHBcRTocEi .arrowheadPath{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-2vlrBDFHBcRTocEi .flowchart-link{stroke:#333;fill:none}#mermaid-svg-2vlrBDFHBcRTocEi .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-2vlrBDFHBcRTocEi .edgeLabel rect{opacity:0.9}#mermaid-svg-2vlrBDFHBcRTocEi .edgeLabel span{color:#333}#mermaid-svg-2vlrBDFHBcRTocEi .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-2vlrBDFHBcRTocEi .cluster text{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-2vlrBDFHBcRTocEi .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-2vlrBDFHBcRTocEi text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-2vlrBDFHBcRTocEi .actor-line{stroke:grey}#mermaid-svg-2vlrBDFHBcRTocEi .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-2vlrBDFHBcRTocEi .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-2vlrBDFHBcRTocEi #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-2vlrBDFHBcRTocEi .sequenceNumber{fill:#fff}#mermaid-svg-2vlrBDFHBcRTocEi #sequencenumber{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi #crosshead path{fill:#333;stroke:#333}#mermaid-svg-2vlrBDFHBcRTocEi .messageText{fill:#333;stroke:#333}#mermaid-svg-2vlrBDFHBcRTocEi .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-2vlrBDFHBcRTocEi .labelText,#mermaid-svg-2vlrBDFHBcRTocEi .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-2vlrBDFHBcRTocEi .loopText,#mermaid-svg-2vlrBDFHBcRTocEi .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-2vlrBDFHBcRTocEi .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-2vlrBDFHBcRTocEi .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-2vlrBDFHBcRTocEi .noteText,#mermaid-svg-2vlrBDFHBcRTocEi .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-2vlrBDFHBcRTocEi .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-2vlrBDFHBcRTocEi .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-2vlrBDFHBcRTocEi .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-2vlrBDFHBcRTocEi .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .section{stroke:none;opacity:0.2}#mermaid-svg-2vlrBDFHBcRTocEi .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-2vlrBDFHBcRTocEi .section2{fill:#fff400}#mermaid-svg-2vlrBDFHBcRTocEi .section1,#mermaid-svg-2vlrBDFHBcRTocEi .section3{fill:#fff;opacity:0.2}#mermaid-svg-2vlrBDFHBcRTocEi .sectionTitle0{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .sectionTitle1{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .sectionTitle2{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .sectionTitle3{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-2vlrBDFHBcRTocEi .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .grid path{stroke-width:0}#mermaid-svg-2vlrBDFHBcRTocEi .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-2vlrBDFHBcRTocEi .task{stroke-width:2}#mermaid-svg-2vlrBDFHBcRTocEi .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .taskText:not([font-size]){font-size:11px}#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-2vlrBDFHBcRTocEi .task.clickable{cursor:pointer}#mermaid-svg-2vlrBDFHBcRTocEi .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-2vlrBDFHBcRTocEi .taskText0,#mermaid-svg-2vlrBDFHBcRTocEi .taskText1,#mermaid-svg-2vlrBDFHBcRTocEi .taskText2,#mermaid-svg-2vlrBDFHBcRTocEi .taskText3{fill:#fff}#mermaid-svg-2vlrBDFHBcRTocEi .task0,#mermaid-svg-2vlrBDFHBcRTocEi .task1,#mermaid-svg-2vlrBDFHBcRTocEi .task2,#mermaid-svg-2vlrBDFHBcRTocEi .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutside0,#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutside2{fill:#000}#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutside1,#mermaid-svg-2vlrBDFHBcRTocEi .taskTextOutside3{fill:#000}#mermaid-svg-2vlrBDFHBcRTocEi .active0,#mermaid-svg-2vlrBDFHBcRTocEi .active1,#mermaid-svg-2vlrBDFHBcRTocEi .active2,#mermaid-svg-2vlrBDFHBcRTocEi .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-2vlrBDFHBcRTocEi .activeText0,#mermaid-svg-2vlrBDFHBcRTocEi .activeText1,#mermaid-svg-2vlrBDFHBcRTocEi .activeText2,#mermaid-svg-2vlrBDFHBcRTocEi .activeText3{fill:#000 !important}#mermaid-svg-2vlrBDFHBcRTocEi .done0,#mermaid-svg-2vlrBDFHBcRTocEi .done1,#mermaid-svg-2vlrBDFHBcRTocEi .done2,#mermaid-svg-2vlrBDFHBcRTocEi .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-2vlrBDFHBcRTocEi .doneText0,#mermaid-svg-2vlrBDFHBcRTocEi .doneText1,#mermaid-svg-2vlrBDFHBcRTocEi .doneText2,#mermaid-svg-2vlrBDFHBcRTocEi .doneText3{fill:#000 !important}#mermaid-svg-2vlrBDFHBcRTocEi .crit0,#mermaid-svg-2vlrBDFHBcRTocEi .crit1,#mermaid-svg-2vlrBDFHBcRTocEi .crit2,#mermaid-svg-2vlrBDFHBcRTocEi .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-2vlrBDFHBcRTocEi .activeCrit0,#mermaid-svg-2vlrBDFHBcRTocEi .activeCrit1,#mermaid-svg-2vlrBDFHBcRTocEi .activeCrit2,#mermaid-svg-2vlrBDFHBcRTocEi .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-2vlrBDFHBcRTocEi .doneCrit0,#mermaid-svg-2vlrBDFHBcRTocEi .doneCrit1,#mermaid-svg-2vlrBDFHBcRTocEi .doneCrit2,#mermaid-svg-2vlrBDFHBcRTocEi .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-2vlrBDFHBcRTocEi .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-2vlrBDFHBcRTocEi .milestoneText{font-style:italic}#mermaid-svg-2vlrBDFHBcRTocEi .doneCritText0,#mermaid-svg-2vlrBDFHBcRTocEi .doneCritText1,#mermaid-svg-2vlrBDFHBcRTocEi .doneCritText2,#mermaid-svg-2vlrBDFHBcRTocEi .doneCritText3{fill:#000 !important}#mermaid-svg-2vlrBDFHBcRTocEi .activeCritText0,#mermaid-svg-2vlrBDFHBcRTocEi .activeCritText1,#mermaid-svg-2vlrBDFHBcRTocEi .activeCritText2,#mermaid-svg-2vlrBDFHBcRTocEi .activeCritText3{fill:#000 !important}#mermaid-svg-2vlrBDFHBcRTocEi .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-2vlrBDFHBcRTocEi g.classGroup text .title{font-weight:bolder}#mermaid-svg-2vlrBDFHBcRTocEi g.clickable{cursor:pointer}#mermaid-svg-2vlrBDFHBcRTocEi g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-2vlrBDFHBcRTocEi g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-2vlrBDFHBcRTocEi .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-2vlrBDFHBcRTocEi .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-2vlrBDFHBcRTocEi .dashed-line{stroke-dasharray:3}#mermaid-svg-2vlrBDFHBcRTocEi #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi .commit-id,#mermaid-svg-2vlrBDFHBcRTocEi .commit-msg,#mermaid-svg-2vlrBDFHBcRTocEi .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-2vlrBDFHBcRTocEi g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-2vlrBDFHBcRTocEi g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-2vlrBDFHBcRTocEi g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-2vlrBDFHBcRTocEi .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-2vlrBDFHBcRTocEi .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-2vlrBDFHBcRTocEi .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-2vlrBDFHBcRTocEi .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-2vlrBDFHBcRTocEi .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-2vlrBDFHBcRTocEi .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-2vlrBDFHBcRTocEi .edgeLabel text{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-2vlrBDFHBcRTocEi .node circle.state-start{fill:black;stroke:black}#mermaid-svg-2vlrBDFHBcRTocEi .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-2vlrBDFHBcRTocEi #statediagram-barbEnd{fill:#9370db}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-state .divider{stroke:#9370db}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-2vlrBDFHBcRTocEi .note-edge{stroke-dasharray:5}#mermaid-svg-2vlrBDFHBcRTocEi .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-2vlrBDFHBcRTocEi .error-icon{fill:#522}#mermaid-svg-2vlrBDFHBcRTocEi .error-text{fill:#522;stroke:#522}#mermaid-svg-2vlrBDFHBcRTocEi .edge-thickness-normal{stroke-width:2px}#mermaid-svg-2vlrBDFHBcRTocEi .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-2vlrBDFHBcRTocEi .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-2vlrBDFHBcRTocEi .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-2vlrBDFHBcRTocEi .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-2vlrBDFHBcRTocEi .marker{fill:#333}#mermaid-svg-2vlrBDFHBcRTocEi .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-2vlrBDFHBcRTocEi {color: rgba(0, 0, 0, 0.75);font: ;}

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、运行环境
项目 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 也正常支持,其他数据库未知

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.学习成本
项目 Activiti UFLO2 Snaker
上手难易程度 相对简单
网上资源 资源丰富,视屏教程,文献丰富 除官方文档外资料较少 除官方文档外资源较少
官方文档 英文文档 中文文档,代码中注释详细 中文文档,代码中注释详细
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 自增服务(大部分都是关于用户、部门、角色、组织的查询)
MapAdapter Map适配器:大部分都是Map处理相关的静态方法
ProcessInterceptor 过程拦截
ProcessService 流程服务:流程模板、流程实例的处理
RestService 复位服务
SchedulerService 调度服务:调度、提醒
TaskService 任务服务

Snaker

名称 释义
IProcessService 流程模型服务。提供的功能:保存流程定义、根据流程模型文件部署流程、根据主键ID获取流程定义对象
IOrderService 流程实例服务。提供的功能:根据流程定义创建流程实例、添加全局变量、完成流程实例、终止流程实例
ITaskService 任务服务。提供的功能:创建任务、添加删除参与者、完成任务、撤回任务、回退任务、提取任务
IQueryService 流程相关的查询服务。提供的功能:分页查询流程实例、任务、历史流程实例、任务参与者
IManagerService 管理服务接口,用于流程管理控制服务委托管理时限控制
10.数据库表对比
引擎名 数据库创建
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;

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

ActivitiUFLO2Snaker流程引擎对比分析相关推荐

  1. activiti5、activiti6、activiti7、flowable、camunda7、camunda8流程引擎对比分析和选型参考

    常见的开源工作流引擎有哪些?该如何选择?市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda,其中activiti又有activiti5.a ...

  2. 工作流程引擎:流程引擎对比

    一. 简介 工作流引擎 LiteFlow 需要提前定义好执行流程,不支持分布式执行,支持xml,json,yml,支持逻辑执行 AirFlow ***** 支持分布式算子执行,不支持java算子执行, ...

  3. flash3D引擎对比分析

    flash 3D引擎简介     flash3D引擎有不下10款,在使用的时候真的是会让人犯难,我个人曾经使用过一段时间PV3D,感觉PV3D的创建时间,用户规模等等相对都要更加成熟,因此我自己更加推 ...

  4. 十大B2C网站购物车的流程设计对比分析

    购物车对整站的转化率和用户体验的提升有很大的帮助,所以一个设计非常合理的购物车对任何B2C都非常重要.在这里看看京东.亚马逊.易迅.1号店.库巴.国美.当当.凡客.苏宁.新蛋十家B2C的购物车设计. ...

  5. 工作流引擎JFlow与activiti 对比分析(一)5种基本控制流模式的对比

    为了更好的说明activiti 与jflow的两款工作流引擎的特点与区别,我们按照如下几个方面做一次全面的.客观的对比. 首先activiti是国外的一款开源的工作流程引擎,在国际上影响比较深远与广泛 ...

  6. 流程引擎之发展史及对比总结

    流程引擎渊源 市场上比较有名的开源流程引擎有 jBPM.Activiti.Camunda.Flowable 和 Compileflow.其中 jBPM.Activiti.Flowable.camund ...

  7. 流程引擎之Flowable简介

    背景 Flowable 是一个流行的轻量级的采用 Java 开发的业务流程引擎,通过 Flowable 流程引擎,我们可以部署遵循 BPMN2.0 协议的流程定义(一般为XML文件)文件,并能创建流程 ...

  8. 流程引擎之compileflow简介

    背景 compileflow 是一个非常轻量.高性能.可集成.可扩展的流程引擎.compileflow Process 引擎是淘宝工作流 TBBPM 引擎之一,是专注于纯内存执行,无状态的流程引擎,通 ...

  9. 流程引擎之Camunda简介

    背景 Camunda 是支持 BPMN(工作流和流程自动化).CMMN(案例管理) 和 DMN(业务决策管理) java 框架.Camunda 基于Activiti5 保留了 PVM,其开发团队也是从 ...

  10. 小白学流程引擎-FLowable(一) —FLowable是什么

    小白学流程引擎-FLowable(一) | FLowable是什么 一.什么是流程引擎? 通俗的说,流程引擎就是多种业务对象在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是流程引擎. 流 ...

最新文章

  1. C# vs. C++/C : 从技术管理角度的分析(附: .Net 在桌面领域的潜敌分析)
  2. 【杂谈】有三AI知识星球一周年了!为什么公众号+星球才是完整的?
  3. 《17探索,18前行》
  4. php定义一个名为Vehicles,[PHP][Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]...
  5. 几何画板自定义工具_用好神奇的数学工具--几何画板,轻松作出复杂的几何图形...
  6. Java字符类isUpperCase()方法与示例
  7. VMware虚拟机运行虚拟系统时显示“内部错误”的解决方法
  8. 4.ID主键生成策略
  9. python中集合用法大全
  10. Confluence自启动脚本
  11. android 批量扫描,Android:连续扫描所有AP(接入点)
  12. MySQL数据库使某个不是主键的字段唯一
  13. xp计算机保护系统,XP系统总是弹出“Windows文件保护”窗口提示的解决方法
  14. Apizza在线接口工具动态绑定API参数依赖
  15. PN结的形成及其单向导电性
  16. 拿它们练Python爬虫,是在法律边缘试探吗?爬虫圈香饽饽之视频网站的评论区采集
  17. APP试玩应用如何赚钱?今天它来了!新手教程【建议收藏】
  18. # c语言判断字符类型
  19. 三极管基础分类, 参数选择及常见型号对比
  20. CSS背景图和渐变色共存

热门文章

  1. 用php做滚动,用PHP+java实现自动新闻滚动窗口
  2. 世界卫生组织健康标准
  3. 【7集iCore3基础视频】7-5 iTool2驱动安装
  4. java发微信_java实现微信发送消息
  5. 有没有一瞬间不想活了?
  6. 沧海一声笑,移动应用的CRASH原因我找到! --记最新款数字化测试“星云测试“的使用攻略
  7. android安全静态分析,[分享]发几个Android静态和动态分析的小技巧
  8. ACOUG年会归来(r11笔记第16天)
  9. FPGA课设实验二:计数器设计与仿真
  10. 在linux系统下ping不通windows主机问题