本文转载自微信公众号《小二十七》,作者小二十七。转载本文请联系小二十七公众号。BPMN介绍和ActivitiWorkflow介绍在任何行业和企业中,都有各种各样的流程,比如:请假流程、报销流程、入职流程、离职流程、出差流程等等……即使你没有自己设计过工作流,那么你肯定也有日常使用的流程。为什么使用BPMN?对于流程控制,有一个比较初级的方法:在业务代码中增加一个Status(状态机)字段来维护流程状态,负责流程的审批人也可能是HardCode(硬编码)。这种方法实现过程的初始阶段会比较快,但是从长远来看会存在几个问题:过程的健壮性差。每当人员变动或组织架构调整时,都需要修改代码,维护成本高。该过程不能重复使用。当组织出现一个新的工作流,还要重写一套代码,开发成本非常高流程与业务代码耦合,你有我,我有你(不符合单一职责和解耦的设计原则)BPMN:businessprocessmodelandnotationwork工作流是对各个行业流程的抽象,如电信、软件、制造、金融、办公自动化等。为了向所有业务参与者提供易于理解的标准符号,业务流程建模符号(BPMN)由业务流程管理倡议BPMI开发。BPMI组织于2005年并入OMG国际规范组织(ObjectManagementGroup),目前的BPMN规范由OMG组织维护。为什么要遵守规范?跟随市场行为例子:我们日常的电池?有7和5的标准,你当然可以生产6的电池,谁买谁都不知道,如果你按照标准生产的电池可以直接用在大部分电器上。如果你生产AA电池,那么你只能自己开发AA电池的电器,更谈不上你的做法是否得到市场和行业的认可。许多不同标准的出现对消费者来说也是一场灾难。比如微软的IE和FireFox的两套标准,让开发者现在才意识到自己有多痛苦。.遵循行业共识目前主流的工作流厂商都是基于BPMN2.0规范开发流程,请充分掌握和理解当前规范,然后再站在自己的规范上。此外,运城JeectBoot还需要为产品和业务人员学习和理解BPMN符号,以便对业务进行建模。可以看这篇文章:大家都是产品体验:关于BPMN流程建模方法,让你可以利用现有的一些BPMN流程设计器工具快速对业务进行建模(无需自己开发),只需将导出的*.bpmn文件导入即可遵循BPMN规范运行的流程引擎。充分利用行业的生态和工具。这就是遵循规范的好处。有银弹吗?(BPMN的适用场景)我们知道软件行业没有银弹。任何工具都有适用的场景。如果将工具放在不合适的场景中,最终会事半功倍。流程引擎不是灵丹妙药,它是复杂流程和抽象重用的工具。对于那些工作流较多且复杂的业务系统,合理使用流程引擎会大大降低我们开发工作流的成本和时间,最终交付的效果会比自己开发流程引擎好很多。但是如果你的业务系统没有那么多的工作流,或者只有非常简单的A->B的状态传递,那么引入流程引擎显然是一匹大马拉大车,费时费力不说,而且会导致简单的需求开发很麻烦,拉长了开发周期时间,最终交付的效果可能也不是很好。因此,选择合适的工具就成了程序员最重要的选择。Activiti是针对大型系统复杂流程的实战工具,不推荐用于流程不复杂的小场景和业务系统。本章小结:为什么要使用工作流引擎?自研流程,流程与业务耦合,不仅导致代码开发和修改成本高,而且流程偏向自定义开发,无法复用,就像自己生产AA电池一样??流程引擎能够以极低的成本快速实现业务工作流,提高开发效率,而且在生产中经过检验的流程引擎也比谁从0写流程靠谱。流程引擎的功能不多在具体来说,可以通过逻辑代码来实现。流程引擎的核心功能在于设计层面的高质量复用和解耦(设计思维、语言和技术栈相互独立)。可以使用成熟的工具,比如bpmn流程设计工具等……系统需要实现的工作流越多,使用工作流的好处就越大。流程引擎不是灵丹妙药,它只适用于工作流多且复杂的大型业务系统,如果是流程逻辑简单的业务系统,那么不推荐使用流程引擎BPMN规范介绍由于随着BPMN1.0规范的流行,OMG(ObjectManagementGroup)组织于2011年1月发布了BPMN2.0规范,BPMN2.0版本继承了1.0版本,重点关注流程执行语法和标准交换格式。OMG组织致力于维护BPMN规范的两个目标:流程可移植性:BPMN2.0规范定义了业务流程的符号和模型,并设置了流程定义的转换格式,以使流程定义具有可移植性和灵活性,用户可以在不同的供应商环境中定义流程,并且这些流程可以迁移到其他符合BPMN2.0的供应商环境。解决简单与复杂的平衡:BPMN希望在流程设计与复杂需求之间找到平衡点,让非技术人员也能构建简单易懂的业务流程模型,同时也能处理高度复杂的业务流程,所以需要解决这个问题两个相互冲突的需求要求在BPMN规范中定义标准的图形和符号。BPMN2.0的四大基本要素的图解结构和元素,建议直接参考WIKI百科的回答,这里就不搬了:Wiki百科:BPMN业务流程模型和表示法2.0的几处改进与BPMN1.0,主要有以下改进:规定了流程元素的执行语法。定义了流程模型和流程图的扩展机制。事件的组成被细化。扩展的参与者交互定义。编排模型已定义。Activiti简介Activiti是目前国内基于BPMN2.0规范的主流工作流引擎。已经发布到7.X版本,开始实现DMN规范(决策和图形,后面会讲到)。有一些老玩家比如:JBPM现在也发展的很好,还有目前比较新的流程引擎:camunnda,flowable目前好像很有潜力,都是遵循BPMN2.0规范的,因为比较国内的应用主流,所以这里着重介绍一下Activiti的产生和发展。这里简单介绍一下JBPM和Activiti的发展历程。有兴趣的可以去谷歌搜索一下Activiti的发展路线:TomBaeyens是JBPM的创始人,因为理念不契合。TomBaeyens加入了Alfresco公司,后来发布了Activit5JBPM,因此放弃了JBPM4架构,完全基于DroolsFlow重新开发了JBMP5,但他们也支持BPMN2.0规范。从正统的延续来看,Activit5更像是JBPM3和JBPM4的延续,所以国内大部分企业选择ActivitJBPM和Activiti是为了区别JBPM推翻历史架构,重新使用DroolsFlow作为工作流架构.JBPM采用LGPL开源协议,源代码修改需要商业授权。Activiti采用了比较宽松的ApacheLicense2.0Protocol...(想到再补充)TheofficialActivitiexampleActiviti官方的演示程序,你可以先用这个例子来了解Activiti的大部分功能,包括:流程定义流程发布动态表单等,通过本示例程序,作为切入的Activiti建立了初步的了解后,您将更有信心去理解Activiti工作流引擎。示例程序下载使用步骤:Activiti6.0示例程序将sampleprogram/wars目录下的3个程序复制到Tomcat/webapps目录下,然后启动Tomcat即可访问示例程序:http://localhost:8080/activiti-app/#/输入默认账号:admin/test访问Activiti目录/wars下的三个示例程序职责分工:应用描述地址默认账号activiti-app一个比较完整的流程引擎示例程序/activiti-appadmin/testactiviti-admin用于查看流程引擎中的主要数据/activiti-adminadmin/adminactiviti-restrest-api应用API,不再局限于Jar/activiti-restkermit/kermit简单演示工作流程几个步骤:进入activiti-app系统,设计创建用户的简单工作流程,创建HRApp应用流程节点绑定用户,设置请假流程,发布员工进入HRApp程序提交请假请求申请经理进入系统,同意员工的请假申请。示例过程完成。通过activiti-admin程序连接到activiti-app,查看进程历史。进入activiti-app系统。这里简单介绍一下创建用户的三个菜单的主要功能:KickstartApp:定义应用程序,设计流程,建立程序与流程的关系TaskApp:管理示例程序的任务,如:我的待办事项,启动流程等身份管理:在身份管理->用户菜单中管理用户、用户组等信息,创建两个用户用于模拟工作流:在KickstartApp->Processes创建了一个简单的休假流程。值得注意的是,流程变量需要分配给用户任务。这里我们为了简单直接绑定用户,如图:最后我们在KickstartApp->Apps中创建一个应用,并绑定我们刚刚设计的离开流程,如图:记得释放流程,这样当我们作为普通员工jack切换到系统时,就可以看到发布的申请,并且可以发起请假申请,如图:显示新App今天感觉有点不舒服,进入HRApp即可发起请假申请,如图:我的请假申请提交后,任务会自动发送给经理。我们切换经理账号看看:当经理点击Finish时,流程完成,任务会自动结束那么如果要查看流程历史,需要使用activiti-admin演示程序:打开链接:http://localhost:8080/activiti-admin/进入首页,首次进入默认账号admin/admin进入配置activiti-app的信息如图:activiti-appConfig这里我们配置好后可以直接打开Instance,然后我们就可以看到所有执行过的进程的历史记录。点击流程实例可以看到详细的历史信息,如图:本文概要主要介绍:工作流概念与发展BPMN与Activiti的诞生与发展Activiti官方示例程序演示面对背后的进阶知识。更好地了解Activiti和BPMN2.0的世界。
