Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。
Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。
使用场景:多人协作的(或者需要动态变动)的业务流程场景。
通俗易懂activiti使用场景理解:
(以请假为例:开始->请假->审批【部门经理】->审批【总经理】->结束)
在传统的涉及到业务状态相关的场景下,一般都采用在数据库表中增加一个字段status,来表示当前业务流程的状态。每次有人申请请假,则在数据库中记录一条记录,初始status设置为0。如果该请假事件已经被部门经理审批通过了则设置status=1,如果该请假事件已经被部门经理审批拒绝了则设置status=2。然后程序里面判断如果status==1则表示部门经理审批通过了,然后将请假事件流转到总经理来处理。同样总经理审批过了则设置status=3,如果此时总经理审批拒绝了则设置staus=4.这样页面展示时候就可以根据status来判断当前请假事件处在什么流程状态当中。
使用activiti优势?
如果使用activiti,还是以上述请假流程为例:
(开始->请假->审批【部门经理】->审批【总经理】->结束)
在activiti中设计一个业务处理流程(如下表格请假业务流程xml示例):下图xml文件,描述了开始到结束及中间几大任务过程。
activiti会自动生成23张数据库表来记录各种业务流程的状态及操作事件。若以上述请假为例:第一步将该请假业务流程部署到activiti系统,当系统将该业务流程部署启动时,则业务流程开始,即张三提出一次请假申请业务流程开始了,activiti在部署该业务流程时候,会自动记录该流程中所有任务及当前处理到那个任务状态。(相比于传统的处理方式,activiti将状态自动保存到数据库里面了,不需要用户去设计数据库表字段status来标识业务流程当前状态)。传统方式如果需要去取当前业务状态,则自己封装api从业务service层到数据库Dao向数据库取得status字段值,即当前业务流程状态。那么activiti里面该如何获取当前业务流程状态呢?activiti中封装了一系列API(核心的都有几十上百个,几乎常用的业务场景全部已经封装好了),可以去获取当前业务流程的状态。在传统的方法中,如果一个状态改变,需要流转到下一个状态,需要编码人员,写代码判断状态去流转。而在activiti中,它灵活的事件机制能够自动高效的推动业务流转。
使用activiti缺点:
第一就是学习成本,activiti的简单demo实验不难。但是若想灵活运用activiti来适用于比较多的真实业务场景,还是需要不少的时间。至少需要熟练掌握activiti常用的核心API调用。
第二:由于activiti实现了BPMN 2.0规范,因此大部分业务场景下的业务流程都能支持,这样就导致数据库系统相当庞大(23张表),在大型系统中,如果采用activiti会导致后期业务流程过多导致数据库数据太庞大,可能会影响到整个业务系统的自定制灵活性,包括一些数据库访问的性能问题,而且一般大公司一般有技术研发能力开发自己的类似能支撑自身业务的系统(个人猜想)。
activiti动态编排:能够实时动态编排业务流程。第一次部署时需要部门经理审批接着则是总经理审批,某天公司有新制度,不希望总经理来审批,希望部门经理全权负责,那么在传统方法可能就需要去修改代码来改变流程了。但是在activiti中由于一切业务流程关系都用23张数据库表进行了记录。因此只需要重新编写新的业务流程xml,然后重新部署,即可生效,灵活性就凸显出来了。
activiti优秀的事件监听机制。这样就不需要像传统方法那样去写状态判断代码,然后流转。而activiti有其自身的事件机制,自动跟着你设计好的业务流程xml,来流转。
activiti的请假业务流程xml示例: <process id="DemoProcess" name="DemoProcess" isExecutable="true"> <startEvent id="startevent1" name="Start"></startEvent> <endEvent id="endevent1" name="End"></endEvent> <userTask id="usertask1" name="请假申请" activiti:assignee="张三"></userTask> <userTask id="usertask2" name="批准(部门经理)" activiti:assignee="李四"></userTask> <userTask id="usertask3" name="批准(总经理)" activiti:assignee="王五"></userTask> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow> <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow> <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow> <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow> </process> |
(上述仅代表个人观点,理解不正确地方感谢大家指正~!!!)