目录
一、前言
在流程服务方面也工作了挺长时间,项目上的工作流框架也在中途重构了一下子,底层工作流也从原先的手写到之后的重构成开源工作流框架Activiti,因此也一直想稍稍总结下Activiti,作一个入门知识留作储备。由于原先的项目在框架上还是选择的Spring,当时Activiti6也才刚面世,考虑到不太稳定以及相应文档资料过少因此最终项目上使用的5.22的版本,本系列演示的Activiti版本则为6.0。这第一篇则是介绍工作流的基本概念以及Activiti-app的使用。
二、Activiti简介
Activiti简而言之就是一款开源的工作流引擎,是由JBPM的创建者Tom Baeyens在离开JBOSS之后建立的项目,其同样实现了BPMN2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。那么何为工作流呢?对于没有接触过的人来说可能不是很清楚,其实特别简单,以烂透了的请假流程为例,每一个过程都是事先定义好的且都是按照规则一步步执行,从提交流程开始->部门经理审批->总经理审批,三个过程独立执行且应用这种模型也提高了请假效率。既然有了工作流,那么自然就有大牛设计了工作流引擎,即将一系列业务场景通通抽象出来做成标准流程图,然后放入流程引擎中即可按照流程定义约定逐步流转,因此工作流引擎主要用于解决复杂的业务场景。
三、Activiti-app安装使用
首先,如果需要使用Activiti-app简易流程软件,必须先按照jdk以及tomcat,若未安装读者可自行google,这里我提供Activiti6.0的整包下载地址:https://pan.baidu.com/s/1iXzTmBOZCsV4Z7_LQErbSQ 密码:4ufc
下载完毕后,解压Activiti6.0,然后将wars目录下的activiti-admin.war、activiti-app.war两个war包拷贝到tomcat的webapps目录下,然后进到tomcat的bin目录下启动tomcat
sh startup.sh
接着就可以在浏览器访问Activiti-app了,http://localhost:8080/activiti-app,默认密码为:admin/test,首页展示如下说明登陆成功:
四、创建第一个流程
在工作流中,通常所说的流程是指流程定义,当使用这个流程定义去创建工单的时候,同时会创建一个流程实例,用于保存此时此刻的流程信息,防止工单在流转过程中流程发生变化而导致工单走不下去的情况。由于流程需要人员审批,因此首先我们需要创建人员
1、创建用户
从首页选择第三个模块即 Identity management(身份管理),进去之后选择Users标签页,如下
然后点击Create user,填写用户信息即可,此处我新增了三个用户
2、创建流程定义
然后点击左上角的标志回到首页,选择第一个模块即Kickstart App,开始创建流程定义
填好基本信息,点击创建即可
此时进入流程图编辑页面,如下:
第一次进来的话会有一些基本介绍,小白可以跟着学习下,这边我直接使用最简单的人工节点来画这第一个模型即User Task和End event
画好流程图之后还需要指定各流程的审批人员,人员是工作流中最为重要的一环,许多复杂流程往往会出现人员分配错误的情况,这边直接赋值即可
选中需赋值的流程环节,然后点击Assignments后的选项值,选择第一阶段我们所创建的人员,最后保存即可
全部编辑完后点击左上角的保存按钮保存当前流程,在流程界面就能看到我们刚才创建的流程模型啦
在Acitiviti-app中,创建流程还不够,还需要创建一个app来暴露给其余用户使用,相当于包了一层而已,因此我们需要创建一个app,进到Apps标签下新建一个app后然后关联我们刚才创建的请假流程即可
然后保存发布后,在首页就能看到我们新增的app啦
3、测试流程
测试的话就比较简单了,使用test03账号登陆Activiti-app后就能看到我们刚才创建的请假app,然后创建单子即可,可以带上备注信息,之后分别切换各环节审批人员的账号上去进行审批,全部完成后流程自动结束。
五、使用Activiti-admin查看历史记录
当流程走完后,我们可以使用Activiti-admin来查看我们的工单历史记录,进入http://localhost:8080/activiti-admin,默认密码为:admin/admin,
进去之后需要修改配置信息,否则始终会报错,需要将端口号改成Tomcat默认的8080,同时这里的账号和密码是Activiti-app的账号密码,即admin/test
然后点击Check就能看到绿色的通行证啦~可以分别切换不同的标签页查看不同的内容
六、获取xml文件
进入流程模型详情点击下载即可得到该模型对应的xml文件xxxx.bpmn20.xml,这也就是一份完整的流程文件,可在代码中用于发布并最终作为流程运转。
xml文件详情如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="vocation" name="请假流程" isExecutable="true">
<startEvent id="startEvent1"></startEvent>
<userTask id="sid-EA9C8B20-4BA6-47D4-86D3-B21EBF0BD990" name="直属经理审批" activiti:assignee="test">
<extensionElements>
<modeler:activiti-idm-assignee xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-assignee>
<modeler:assignee-info-email xmlns:modeler="http://activiti.com/modeler"><![CDATA[test@qq.com]]></modeler:assignee-info-email>
<modeler:assignee-info-firstname xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:assignee-info-firstname>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<userTask id="sid-926AAE81-063A-4D88-B509-362C3D96481E" name="总经理审批" activiti:assignee="test">
<extensionElements>
<modeler:activiti-idm-assignee xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-assignee>
<modeler:assignee-info-email xmlns:modeler="http://activiti.com/modeler"><![CDATA[test@qq.com]]></modeler:assignee-info-email>
<modeler:assignee-info-firstname xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:assignee-info-firstname>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<endEvent id="sid-24F3BD99-87CC-4F2F-940A-062AC90838DD"></endEvent>
<sequenceFlow id="sid-ACE554C1-6250-44D2-95CC-49200E2E943F" sourceRef="startEvent1" targetRef="sid-EA9C8B20-4BA6-47D4-86D3-B21EBF0BD990"></sequenceFlow>
<sequenceFlow id="sid-8C609B42-C142-4C96-93A3-484818E67A8A" sourceRef="sid-EA9C8B20-4BA6-47D4-86D3-B21EBF0BD990" targetRef="sid-926AAE81-063A-4D88-B509-362C3D96481E"></sequenceFlow>
<sequenceFlow id="sid-8E6039BD-0943-4D40-A6DE-3BD09A5A3008" sourceRef="sid-926AAE81-063A-4D88-B509-362C3D96481E" targetRef="sid-24F3BD99-87CC-4F2F-940A-062AC90838DD"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_vocation">
<bpmndi:BPMNPlane bpmnElement="vocation" id="BPMNPlane_vocation">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="100.0" y="155.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-EA9C8B20-4BA6-47D4-86D3-B21EBF0BD990" id="BPMNShape_sid-EA9C8B20-4BA6-47D4-86D3-B21EBF0BD990">
<omgdc:Bounds height="80.0" width="100.0" x="199.0" y="130.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-926AAE81-063A-4D88-B509-362C3D96481E" id="BPMNShape_sid-926AAE81-063A-4D88-B509-362C3D96481E">
<omgdc:Bounds height="80.0" width="100.0" x="420.0" y="130.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-24F3BD99-87CC-4F2F-940A-062AC90838DD" id="BPMNShape_sid-24F3BD99-87CC-4F2F-940A-062AC90838DD">
<omgdc:Bounds height="28.0" width="28.0" x="645.0" y="156.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-ACE554C1-6250-44D2-95CC-49200E2E943F" id="BPMNEdge_sid-ACE554C1-6250-44D2-95CC-49200E2E943F">
<omgdi:waypoint x="130.0" y="170.0"></omgdi:waypoint>
<omgdi:waypoint x="199.0" y="170.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-8E6039BD-0943-4D40-A6DE-3BD09A5A3008" id="BPMNEdge_sid-8E6039BD-0943-4D40-A6DE-3BD09A5A3008">
<omgdi:waypoint x="520.0" y="170.0"></omgdi:waypoint>
<omgdi:waypoint x="645.0" y="170.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-8C609B42-C142-4C96-93A3-484818E67A8A" id="BPMNEdge_sid-8C609B42-C142-4C96-93A3-484818E67A8A">
<omgdi:waypoint x="299.0" y="170.0"></omgdi:waypoint>
<omgdi:waypoint x="420.0" y="170.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
七、工作流小结
这里再对工作流做一个小结,工作流简单来说就是多个参与者,按照预定义的规则,传递业务信息进行审核功能的一个框架。工作流中常见的概念大概有如下几种:流程定义、流程实例、工单、任务。
流程定义:简单来说就是制定流程的所有信息,包含表单信息、人员分配信息、环节基本信息等。
流程实例:可以认为是某一时刻流程定义的副本集,是专门用来给某一工单所用。
工单:就是流转过程中的具体业务展现,整个流程一般只有一张单子。
任务:就是流程流转到某一环节或某个步骤所产生的任务信息。
这边给出这些概念之间的比例关系,流程定义:流程实例=1:n,流程实例:工单=1:1,工单:任务=1:n
当然在流程流转过程中,还有一个东西特别重要,那就是流程变量。流程变量在项目中主要用来传递业务参数,在连线的条件中也可以设置流程变量,它的另一个作用就是用来指定个人任务和组任务的处理人。