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流程引擎对比分析相关推荐
- activiti5、activiti6、activiti7、flowable、camunda7、camunda8流程引擎对比分析和选型参考
常见的开源工作流引擎有哪些?该如何选择?市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda,其中activiti又有activiti5.a ...
- 工作流程引擎:流程引擎对比
一. 简介 工作流引擎 LiteFlow 需要提前定义好执行流程,不支持分布式执行,支持xml,json,yml,支持逻辑执行 AirFlow ***** 支持分布式算子执行,不支持java算子执行, ...
- flash3D引擎对比分析
flash 3D引擎简介 flash3D引擎有不下10款,在使用的时候真的是会让人犯难,我个人曾经使用过一段时间PV3D,感觉PV3D的创建时间,用户规模等等相对都要更加成熟,因此我自己更加推 ...
- 十大B2C网站购物车的流程设计对比分析
购物车对整站的转化率和用户体验的提升有很大的帮助,所以一个设计非常合理的购物车对任何B2C都非常重要.在这里看看京东.亚马逊.易迅.1号店.库巴.国美.当当.凡客.苏宁.新蛋十家B2C的购物车设计. ...
- 工作流引擎JFlow与activiti 对比分析(一)5种基本控制流模式的对比
为了更好的说明activiti 与jflow的两款工作流引擎的特点与区别,我们按照如下几个方面做一次全面的.客观的对比. 首先activiti是国外的一款开源的工作流程引擎,在国际上影响比较深远与广泛 ...
- 流程引擎之发展史及对比总结
流程引擎渊源 市场上比较有名的开源流程引擎有 jBPM.Activiti.Camunda.Flowable 和 Compileflow.其中 jBPM.Activiti.Flowable.camund ...
- 流程引擎之Flowable简介
背景 Flowable 是一个流行的轻量级的采用 Java 开发的业务流程引擎,通过 Flowable 流程引擎,我们可以部署遵循 BPMN2.0 协议的流程定义(一般为XML文件)文件,并能创建流程 ...
- 流程引擎之compileflow简介
背景 compileflow 是一个非常轻量.高性能.可集成.可扩展的流程引擎.compileflow Process 引擎是淘宝工作流 TBBPM 引擎之一,是专注于纯内存执行,无状态的流程引擎,通 ...
- 流程引擎之Camunda简介
背景 Camunda 是支持 BPMN(工作流和流程自动化).CMMN(案例管理) 和 DMN(业务决策管理) java 框架.Camunda 基于Activiti5 保留了 PVM,其开发团队也是从 ...
- 小白学流程引擎-FLowable(一) —FLowable是什么
小白学流程引擎-FLowable(一) | FLowable是什么 一.什么是流程引擎? 通俗的说,流程引擎就是多种业务对象在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是流程引擎. 流 ...
最新文章
- C# vs. C++/C : 从技术管理角度的分析(附: .Net 在桌面领域的潜敌分析)
- 【杂谈】有三AI知识星球一周年了!为什么公众号+星球才是完整的?
- 《17探索,18前行》
- php定义一个名为Vehicles,[PHP][Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]...
- 几何画板自定义工具_用好神奇的数学工具--几何画板,轻松作出复杂的几何图形...
- Java字符类isUpperCase()方法与示例
- VMware虚拟机运行虚拟系统时显示“内部错误”的解决方法
- 4.ID主键生成策略
- python中集合用法大全
- Confluence自启动脚本
- android 批量扫描,Android:连续扫描所有AP(接入点)
- MySQL数据库使某个不是主键的字段唯一
- xp计算机保护系统,XP系统总是弹出“Windows文件保护”窗口提示的解决方法
- Apizza在线接口工具动态绑定API参数依赖
- PN结的形成及其单向导电性
- 拿它们练Python爬虫,是在法律边缘试探吗?爬虫圈香饽饽之视频网站的评论区采集
- APP试玩应用如何赚钱?今天它来了!新手教程【建议收藏】
- # c语言判断字符类型
- 三极管基础分类, 参数选择及常见型号对比
- CSS背景图和渐变色共存
热门文章
- 用php做滚动,用PHP+java实现自动新闻滚动窗口
- 世界卫生组织健康标准
- 【7集iCore3基础视频】7-5 iTool2驱动安装
- java发微信_java实现微信发送消息
- 有没有一瞬间不想活了?
- 沧海一声笑,移动应用的CRASH原因我找到! --记最新款数字化测试“星云测试“的使用攻略
- android安全静态分析,[分享]发几个Android静态和动态分析的小技巧
- ACOUG年会归来(r11笔记第16天)
- FPGA课设实验二:计数器设计与仿真
- 在linux系统下ping不通windows主机问题