1.参考文档
http://www.mossle.com/docs/activiti/index.html
2.Springboot配置Activiti
在pom
文件中引入依赖,如下
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
<exclusions>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>6.0.0</version>
</dependency>
在 application.yml
文件中加入如下配置
spring:
activiti:
check-process-definitions: true #自动检查、部署流程定义文件
database-schema-update: true #自动更新数据库结构
async-executor-activate: false #停止打印ACT_RU_TIMER_JOB
process-definition-location-prefix: classpath:/processes/ #流程定义文件存放目录
在 项目启动类 上添加如下注解:
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
3.bpmn文件介绍
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" 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" xmlns:tns="Examples" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1539757531057" name="" targetNamespace="Examples" typeLanguage="http://www.w3.org/2001/XMLSchema">
<!--【process】(流程定义根元素,代表了一个流程定义的开始)
id:流程定义ID,代表该流程的唯一性,启动该流程时需要使用该ID(在库中为key_,该字段可重复,"不同版本"同一工作流该字段相同)
isExecutable:表示该流程是否可执行,其值有true和false,默认为true
name:流程名称
type:流程类型
isClosed:流程是否已关闭,关闭不能执行-->
<process id="oneTaskProcess" isClosed="false" name="The One Task Process" processType="None">
<!--【startEvent】(流程启动事件,一个process只能有一个,且必须为流程起始元素)
id:启动节点id
name:启动节点名称-->
<startEvent id="theStart" name="开始"/>
<!--【sequenceFlow】(顺序流)
id:顺序流id
sourceRef:上一个节点id
targetRef:下一个节点id-->
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="task_1"/>
<!--【userTask】(流程中间用户任务,夹在startEvent与endEvent之间的节点,表示需要待办人处理的节点)
id:任务节点id,必须是唯一的
name:任务节点名称
activiti:assignee:任务所属用户,只能指定用户完成这个任务,即任务办理人
activiti:candidateUsers:多个任务办理人
activiti:candidateGroups:任务处理人候选组,处理人必须在这个组内
activiti:exclusive:独家的,好像是在排它性网关中使用,意思应该是在有并行分支情况下,只会走其中一条
activiti:dueDate:设置用户任务到期日期
activiti:priority:用户任务优先级,0-100-->
<userTask activiti:assignee="${user}" activiti:exclusive="true" id="task_1" name="第一次审批">
<!--【extensionElements】(userTask的子元素,用于扩展元素)-->
<extensionElements>
<!--【activiti:taskListener】(扩展元素之一,用于监听某个任务的运行)
event:监听的任务事件名,create、assignment(分配任务)、complete
class:任务监听器类,需要实现TaskListener-->
<activiti:taskListener></activiti:taskListener>
</extensionElements>
</userTask>
<sequenceFlow id="flow2" sourceRef="task_1" targetRef="task_2"/>
<userTask activiti:assignee="${user}" id="task_2" name="正常流转"/>
<sequenceFlow id="flow3" sourceRef="task_2" targetRef="theEnd"/>
<sequenceFlow id="flow4" sourceRef="task_1" targetRef="theEnd"/>
<!--【endEvent】(流程结束事件,一个process只能有一个,且必须为流程结束元素)
id:结束节点id
name:结束节点名称-->
<endEvent id="theEnd" name="结束"/>
</process>
</definitions>