工作流引擎activiti和jbpm哪个比较好?
在常用的ERP系统、OA系统的开发中,工作流引擎是一个必不可少的工具。之前在选择工作流引擎时曾经在activiti和jbpm之间有过比较,当时做出的决定是使用jbpm,但实际开发过程中发现这个选择是不合适的。目前我们改为选择Activiti作为工作流模块的引擎,理由如下:
1、Activiti拥有更简洁健壮的接口
JBPM自从版本五后,便重启炉灶,完全抛弃了JBMP4的代码基础,重新基于drools进行了实现。JBPM5,JBPM6似乎缺少一个合格的系统架构师,其接口设计匪夷所思,基本上是按照drools的接口再提供了一套JBPM接口,同名的接口,实现类不断重复出现,代码体系十分混乱。
一个典型的例子,同样是查询待办事项,在JBPM中接口如下:
List<TaskSummary> getTasksAssignedAsExcludedOwner(String userId, String language); List<TaskSummary> getTasksAssignedAsPotentialOwner(String userId, String language); @Deprecated List<TaskSummary> getTasksAssignedAsPotentialOwner(String userId, List<String> groupIds, String language); @Deprecated List<TaskSummary> getTasksAssignedAsPotentialOwner(String userId, List<String> groupIds, String language, int firstResult, int maxResult); List<TaskSummary> getTasksAssignedAsRecipient(String userId, String language); List<TaskSummary> getTasksAssignedAsTaskInitiator(String userId, String language); List<TaskSummary> getTasksAssignedAsTaskStakeholder(String userId, String language); List<TaskSummary> getTasksOwned(String userId, String language); List<TaskSummary> getTasksOwned(String userId, List<Status> status, String language);
上述接口设计者显然没有考虑接口的修改扩展需要,将各种复杂的查询通过一个又一个的方法提供出来,这将导致今后增加一种查询过滤就必须增加一个getXXX方法,丑陋之至,再看看Activiti的接口:
TaskQuery taskName(String name); TaskQuery taskNameLike(String nameLike); TaskQuery taskDescription(String description); TaskQuery taskDescriptionLike(String descriptionLike); TaskQuery taskPriority(Integer priority); TaskQuery taskMinPriority(Integer minPriority); TaskQuery taskMaxPriority(Integer maxPriority); TaskQuery taskAssignee(String assignee); TaskQuery taskAssigneeLike(String assigneeLike); TaskQuery taskOwner(String owner); TaskQuery taskOwnerLike(String ownerLike); TaskQuery taskUnassigned(); TaskQuery taskUnnassigned(); TaskQuery taskDelegationState(DelegationState delegationState); TaskQuery taskCandidateUser(String candidateUser); TaskQuery taskInvolvedUser(String involvedUser); TaskQuery taskCandidateGroup(String candidateGroup); TaskQuery taskCandidateGroupIn(List<String> candidateGroups); TaskQuery processInstanceId(String processInstanceId); TaskQuery processInstanceBusinessKey(String processInstanceBusinessKey); TaskQuery processInstanceBusinessKeyLike(String processInstanceBusinessKeyLike); TaskQuery executionId(String executionId); TaskQuery taskCreatedOn(Date createTime); TaskQuery taskCreatedBefore(Date before); TaskQuery taskCreatedAfter(Date after); TaskQuery excludeSubtasks(); TaskQuery taskVariableValueGreaterThan(String name, Object value); TaskQuery processDefinitionName(String processDefinitionName); TaskQuery withoutDueDate(); TaskQuery suspended(); TaskQuery orderByTaskAssignee(); TaskQuery orderByProcessInstanceId(); TaskQuery orderByDueDate(); long count(); U singleResult(); List<U> list(); List<U> listPage(int firstResult, int maxResults); }
同样是查询待办事项,Activiti中提供TaskQuery接口,可以设置各种查询过滤,排序方式,最终通过list方法执行查询,相比jbpm,它还提供了分页查询功能,双方高下立判。
2、Activiti支持启动引擎后随时热部署
JBPM存在一个软肋,一个RuntimeService只能在启动的时候指定bpmn资源,一旦启动后便不再能够去更新或者增加bpmn了,这会导致我们系统集成的困难,因为我们自然希望整个系统只有一个工作流引擎实例运行。Activiti则提供了Deploy机制,将bpmn资源的热部署,热更新都做了很好的支持
**
3、Activiti拥有更友好易用的Eclipse编辑插件和在线插件**
从下图就可以看到Activiti在流程编辑上的用心,以及JBPM在流程编辑器上的漫不用心:
4、Activiti依赖更少的jar包
Activiti依赖的第三方jar包较少,主要就是mybatics,而JBPM则依赖了一大堆的jar,从drools到繁杂的hibernate,再到自身拆分的零零散散的jar包,让人不由觉得它是一个庞大的怪物。
5、Activiti拥有更友好的用户体验
虽然JBPM和activiti都是使用bpmn格式作为流程定义语言,但二者都相应地利用了bpmn格式的规范扩展了一些自定义的功能,根据这些扩展它们都提供了自己的绑定表单的方式。JBPM核心引擎完全没有关于表单的任何抽象,它的工作机制是通过全局常量,流程变量,任务变量,这些概念十分技术化。
相比之下Activiti则更贴近实际的应用场景,它将为开始节点,以及人工任务提供了表单设置,用户可以设置字段名称,字段类型。通过Activiti的平台可以根据这些设置去生成表单,但如果不使用其平台只使用引擎的话,也支持通过它来表达与第三方表单的关系。这些表单设置的元数据信息也可以通过接口去获取。
总结:
JBPM5,JBPM6使用drools规则引擎来实现工作流引擎听起来是一个很酷的概念,但JBPM开发团队显然没有很好地去掌控好整个架构的变化。因此选择activiti作为工作流引擎至少在可见的几年间都是正道,今后需要实现规则库时,再单独引入drools工具包,相信drools会是一个比JBPM靠谱的工具。
如果JAVA底子差一点的话可以用XJR快速开发框架,采用主流的Activiti工作流引擎,遵循bpmn规范,可实现XML、Json一键导入导出,以及添加了人员动态选择、便捷式会签设置、便捷式任务委托设置、添加自定义表单、自定义节点按钮、动态变量选择(包括会签变量、按钮变量、表单变量)以及各节点属性优化,遵循以使用者为中心的优化原则,将整个流程的操作变得简单、快捷,实现0基础短时间可自由编辑流程模板。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
03月17日云栖号头条:阿里本地生活宣布“七大商家赋能计划”
云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 今日最新云头条快讯: 阿里本地生活宣布“七大商家赋能计划” ,据阿里方面介绍,未来在与多个流量入口打通后,本地生活平台将每天为商家带来超过1亿访问用户,佣金继续保持在低于行业3%-5%的水平;近日,工信部召开推动产业链协同复工复产电视电话会议,会议强调,要把推动产业链协同复工复产作为当前工作的重点,切实解决企业实际困难,分级分类推动解决省区内及跨地区跨部门问题。 一起来看最新的资讯: 阿里本地生活宣布“七大商家赋能计划” 3月16日,阿里本地生活宣布“七大商家赋能计划” 。据阿里方面介绍,未来在与多个流量入口打通后,本地生活平台将每天为商家带来超过1亿访问用户,佣金继续保持在低于行业3%-5%的水平。与此同时,饿了么口碑要为100万商家升级“数智中台”,通过私域小程序获得的订单不收一分钱佣金。此外,还将帮助超过5000家商家开通天猫店等。 工信部:推动大企业牵引中小企业抱团复工复产 3月16日,工信部召开推动产业链协同复工复产电视电话...
- 下一篇
【Android】四大组件归纳总结
【Android】四大组件归纳总结随着学习持续更新 四大组件均可使用android:process="name"在Manifest中声明成独立进程 Activity#生命周期# 4种启动模式#Android使用回退栈来管理Activity实例。当前显示的Activity在栈顶,当点击后退或返回时,栈顶的Activity出栈。 可以指定Activity的启动模式来避免重复创建同一Activity 在AndroidManifest.xml中声明Activity的启动模式 Copy android:lauchMode="singleTask"></activity> standard默认的启动模式,允许Activity被多次实例化,一个任务栈中会有多个Activity实例 singleTop处于栈顶的Activity会被重用,若不在栈顶则会被重新创建。重用时会调用原来实例的onNewIntent()函数 singleTask(常用)一个任务栈只允许存在一个Activity实例,当startActivity()时,若该Activity在栈内,则会将该Activity上的所有A...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6