纯干货,activiti入门看这一篇就够了‼️‼️
详细讲解了一个activiti流程的从生到死,及每个节点数据库表的变化
<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="line" name="连线" isExecutable="true">
<startEvent id="startEvent1">startEvent>
<userTask id="userTask1" name="指定处理人" default="sid-EDDC5664-19C0-4020-A36D-11F20A1E6962" activiti:assignee="admin">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">modeler:initiator-can-complete>
extensionElements>
userTask>
<userTask id="userTask3" name="监听器" activiti:assignee="test">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">modeler:initiator-can-complete>
extensionElements>
userTask>
<sequenceFlow id="sid-13B085EF-2E80-43D1-BEDF-8950B2A9B783" sourceRef="startEvent1" targetRef="userTask1">sequenceFlow>
<endEvent id="sid-9AFEE86D-C779-494A-8ACD-D2AC0E96C5AD">endEvent>
<sequenceFlow id="sid-DCE668F0-BD17-4EC2-8C65-0334163C1767" sourceRef="userTask3" targetRef="sid-9AFEE86D-C779-494A-8ACD-D2AC0E96C5AD">sequenceFlow>
<sequenceFlow id="sid-AE551128-BF5C-4F31-89B5-E90744E1C7D9" name="拒绝" sourceRef="userTask1" targetRef="userTask3">
<conditionExpression xsi:type="tFormalExpression">conditionExpression>
sequenceFlow>
<sequenceFlow id="sid-EDDC5664-19C0-4020-A36D-11F20A1E6962" name="同意" sourceRef="userTask1" targetRef="sid-9AFEE86D-C779-494A-8ACD-D2AC0E96C5AD">
<conditionExpression xsi:type="tFormalExpression">conditionExpression>
sequenceFlow>
process>
<bpmndi:BPMNDiagram id="BPMNDiagram_line">
<bpmndi:BPMNPlane bpmnElement="line" id="BPMNPlane_line">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="480.0" y="45.0">omgdc:Bounds>
bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="userTask1" id="BPMNShape_userTask1">
<omgdc:Bounds height="80.0" width="100.0" x="445.0" y="180.0">omgdc:Bounds>
bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="userTask3" id="BPMNShape_userTask3">
<omgdc:Bounds height="80.0" width="100.0" x="630.0" y="285.0">omgdc:Bounds>
bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-9AFEE86D-C779-494A-8ACD-D2AC0E96C5AD" id="BPMNShape_sid-9AFEE86D-C779-494A-8ACD-D2AC0E96C5AD">
<omgdc:Bounds height="28.0" width="28.0" x="481.0" y="454.0">omgdc:Bounds>
bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-13B085EF-2E80-43D1-BEDF-8950B2A9B783" id="BPMNEdge_sid-13B085EF-2E80-43D1-BEDF-8950B2A9B783">
<omgdi:waypoint x="495.0" y="75.0">omgdi:waypoint>
<omgdi:waypoint x="495.0" y="180.0">omgdi:waypoint>
bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-DCE668F0-BD17-4EC2-8C65-0334163C1767" id="BPMNEdge_sid-DCE668F0-BD17-4EC2-8C65-0334163C1767">
<omgdi:waypoint x="630.0" y="363.64864864864865">omgdi:waypoint>
<omgdi:waypoint x="506.076673127176" y="459.43803104223696">omgdi:waypoint>
bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-AE551128-BF5C-4F31-89B5-E90744E1C7D9" id="BPMNEdge_sid-AE551128-BF5C-4F31-89B5-E90744E1C7D9">
<omgdi:waypoint x="545.0" y="248.3783783783784">omgdi:waypoint>
<omgdi:waypoint x="630.0" y="296.6216216216216">omgdi:waypoint>
bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-EDDC5664-19C0-4020-A36D-11F20A1E6962" id="BPMNEdge_sid-EDDC5664-19C0-4020-A36D-11F20A1E6962">
<omgdi:waypoint x="495.0" y="260.0">omgdi:waypoint>
<omgdi:waypoint x="495.0" y="454.0">omgdi:waypoint>
bpmndi:BPMNEdge>
bpmndi:BPMNPlane>
bpmndi:BPMNDiagram>
definitions>
部署时只需要部署xml文件即可,流程图png文件会在act_ge_bytearray表自动生成,当然也可以手动选择png文件
/**
* 部署流程定义
*/
@Test
public void deploy() {
Deployment deployment = repositoryService.createDeployment() // 创建部署
.addClasspathResource("diagrams/line.bpmn20.xml") // 加载流程资源文件
.addClasspathResource("diagrams/line.png") // 加载png文件可选
.name("line流程") // 流程名称
.deploy(); // 部署
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署Name:" + deployment.getName());
}
act_ge_bytearray 二进制数据表将生成两条记录,一条xml文件一条流程图文件
act_re_deployment 部署信息表 将生成一条部署记录
act_re_procdef 流程定义数据表 将生成一条数据
id生成规则:流程key+版本+随机数
/**
* 启动流程实例
*/
@Test
public void start() {
ProcessInstance pi = runtimeService.startProcessInstanceByKey("line"); // 流程定义表的KEY字段值
System.out.println("流程实例ID:" + pi.getId());
System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
}
act_ru_execution 运行时流程执行实例表 生成两条记录,一条根记录 一条主线记录
act_ru_task运行时任务节点表 生成一条记录,就是图中这个
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息 表生成一条记录
act_hi_identitylink历史处理人表生成记录
act_hi_procinst历史实例表生成一条记录
act_hi_taskinst历史人物表生成一条记录
act_hi_actinst历史节点表生成两条记录
@Test
public void completeTask2() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("msg", "拒绝");
taskService.complete("100005", variables);//10005为taskid
}
审批通过后再看各个表变化 由于我们是拒绝,所以会走这条线
监听器中固定写死了审批人
新生成了一个task任务
act_ru_task 运行时任务节点表
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
act_hi_identitylink 历史流程人员表
act_hi_detail 历史详情表,提供历史变量的查询
act_hi_procinst 历史流程实例表 没变化
act_hi_taskinst 历史任务实例表
act_hi_actinst 历史节点表
act_hi_varinst 历史变量表
act_ru_variable 运行时流程变量数据表 新生成一个运行时变量
/**
* 完成任务
*/
@Test
public void completeTask() {
taskService.complete("102504"); //102504为任务id
}
再来看下各个表变化
act_ru_execution 运行时流程执行实例表 为空了
act_ru_task 运行时任务节点表 为空了
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息 为空了
act_hi_identitylink 历史流程人员表 没变化
act_hi_detail 历史详情表,提供历史变量的查询 没变化
act_hi_procinst 历史流程实例表 变成已结束了
act_hi_taskinst 历史任务实例表 变成结束了
act_hi_actinst 历史节点表 变成结束了多了个结束节点
act_hi_varinst 历史变量表 没变化
act_ru_variable 运行时流程变量数据表 为空了
要熟练掌握技巧,一定多多练习:纸上得来终觉浅,绝知此事要躬行。