一、Activiti
Activiti项目是一项新的基于Apache许可的开源BPM平台,Activiti 是一个工作流引擎, activiti 可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
二、Activiti7核心机制
- 1️⃣业务流程图要规范化,需要遵守一套标准。
- 2️⃣业务流程图本质上就是一个XML文件,而XML可以存放所要的数据。
- 3️⃣读取业务流程图的过程就是解析XML文件的过程。
- 4️⃣读取一个业务流程图的结点就相当于解析一个XML的结点,进一步将数据插入到MySQL表中,形成一条记录。
- 5️⃣将一个业务流程图的所有节点都读取并存入到MySQL表中。
- 6️⃣后面只要读取MySQL表中的记录就相当于读取业务流程图的一个节点。
- 7️⃣业务流程的推进,后面就转换为读取表中的数据,并且处理数据,结束的时候这一行数据就可以删除了。
三、BPMB
BPMN(Business Process Model And Notation),业务流程模型和符号,是由BPMI(Business Process Management Initiative)开发的一套的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。2004年5月发布了BPMN1.0规范。BPMI于2005年9月并入OMG(The Object Management Group,对象管理组织)组织。OMG于2011年1月发布BPMN2.0的最终版本。
BPMN是目前被各BPM厂商广泛接受的BPM标准。Activit就是使用BPMN2.0进行流程建模、流程执行管理,它包括很多的建模符号。
BPMN其实是用XML表示业务流程的,上面的.bpmn文件使用文本编辑器打开:
<?xml version="1.0" encoding="utf-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process1596086637078" name="流程1596086637078">
<bpmn2:startEvent id="StartEvent_01ydzqe" name="开始">
<bpmn2:outgoing>SequenceFlow_13g4uaz</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="UserTask_1lf9x0v" name="填写请假单">
<bpmn2:incoming>SequenceFlow_13g4uaz</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0yljdna</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="SequenceFlow_13g4uaz" sourceRef="StartEvent_01ydzqe" targetRef="UserTask_1lf9x0v"/>
<bpmn2:userTask id="UserTask_0xa95fp" name="部门经理审批">
<bpmn2:incoming>SequenceFlow_0yljdna</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0wc7wvy</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="SequenceFlow_0yljdna" sourceRef="UserTask_1lf9x0v" targetRef="UserTask_0xa95fp"/>
<bpmn2:userTask id="UserTask_1p57lka" name="人事复核">
<bpmn2:incoming>SequenceFlow_0wc7wvy</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0o4nsg1</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="SequenceFlow_0wc7wvy" sourceRef="UserTask_0xa95fp" targetRef="UserTask_1p57lka"/>
<bpmn2:endEvent id="EndEvent_05yb7io" name="结束">
<bpmn2:incoming>SequenceFlow_0o4nsg1</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="SequenceFlow_0o4nsg1" sourceRef="UserTask_1p57lka" targetRef="EndEvent_05yb7io"/>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process1596086637078">
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="StartEvent_01ydzqe">
<dc:Bounds x="382" y="82" width="36" height="36"/>
<bpmndi:BPMNLabel>
<dc:Bounds x="389" y="58" width="22" height="14"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1lf9x0v_di" bpmnElement="UserTask_1lf9x0v">
<dc:Bounds x="490" y="60" width="100" height="80"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_13g4uaz_di" bpmnElement="SequenceFlow_13g4uaz">
<di:waypoint x="418" y="100"/>
<di:waypoint x="490" y="100"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="UserTask_0xa95fp_di" bpmnElement="UserTask_0xa95fp">
<dc:Bounds x="700" y="60" width="100" height="80"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0yljdna_di" bpmnElement="SequenceFlow_0yljdna">
<di:waypoint x="590" y="100"/>
<di:waypoint x="700" y="100"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="UserTask_1p57lka_di" bpmnElement="UserTask_1p57lka">
<dc:Bounds x="910" y="60" width="100" height="80"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0wc7wvy_di" bpmnElement="SequenceFlow_0wc7wvy">
<di:waypoint x="800" y="100"/>
<di:waypoint x="910" y="100"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="EndEvent_05yb7io_di" bpmnElement="EndEvent_05yb7io">
<dc:Bounds x="1152" y="82" width="36" height="36"/>
<bpmndi:BPMNLabel>
<dc:Bounds x="1159" y="125" width="22" height="14"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0o4nsg1_di" bpmnElement="SequenceFlow_0o4nsg1">
<di:waypoint x="1010" y="100"/>
<di:waypoint x="1152" y="100"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>
四、Activit使用流程
1,实现业务流程建模,使用BPMN实现业务流程图,使用Activiti流程建模工具(例如Activity-designer)定义业务流程(.bpmn文件)。
2,部署业务流程到Activiti,使用Activiti提供的API向Activiti中部署.bpmn文件。
3,启动流程实例(ProcessInstance),启动一个流程实例表示开始一次业务流程的运行,类似实例化两个Java对象一样,部署的流程就好比Java类,启动一个流程实例就好比new一个Java对象。
4,查询待办任务(Task),因为现在系统的业务流程已经交给Activiti管理,通过Activiti就可以查询当前流程执行到哪里了,当前用户需要办理什么任务了,这些Activiti帮我们管理了,而不像传统方式中需要我们在SQL语句中的WHERE条件中指定当前查询的状态值是多少。
5,处理待办任务,用户查询待办任务后,就可以办理某个任务,如果这任务办理完成还需要其他用户办理,比如采购单创建后由部门经理审核,这个过程也是由Activiti帮我们完成了,不需要我们在代码中硬编码指定下一个任务办理人了。当任务办理完成没有下一个任务/结点了,这个流程实例就完成了。
五、开发步骤
1,添加库引用
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>de.odysseus.juel</groupId>
<artifactId>juel-spi</artifactId>
</exclusion>
</exclusions>
</dependency>
2,数据库表含义
当启动activiti项目时,会自动生成activit的数据表结构:
- Activiti的表都是以
ACT_
开头。第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。 ACT_RE_*
:'RE'表示Repository。这个前缀的表包含了流程定义和流程静态资源(图片、规则等等)。ACT_RU_*
:'RU'表示Runtime。这些运行时的表,包含流程实例,任务、变量,异步任务等运行中的数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这些运行时表可以一直很小并且速度很快。ACT_HI_*
:'HI'表示History。这些表包含历史数据,比如历史流程实例,变量,任务等等。ACT_GE_*
:'GE'表示General。通用数据,用于不同场景下。