Activiti的使用
1.部署activiti
2.流程定义
3.流程定义部署
4.启动流程实例
5.用户查询代办任务
6.用户办理任务
7.流程结束
请假审批流程
填写请假申请 -->部门经理审批 -->总经理审批
搭建环境
Activiti 7.0.0.Beta1 +jdk1.8 +mysql 5.7
pom.xml
1 <properties>
2 <slf4j.version>1.6.6</slf4j.version>
3 <log4j.version>1.2.12</log4j.version>
4 </properties>
5
6 <dependencies>
7
8 <dependency>
9 <groupId>org.activiti</groupId>
10 <artifactId>activiti-engine</artifactId>
11 <version>7.0.0.Beta1</version>
12 </dependency>
13
14 <dependency>
15 <groupId>org.activiti</groupId>
16 <artifactId>activiti-spring</artifactId>
17 <version>7.0.0.Beta1</version>
18 </dependency>
19
20 <dependency>
21 <groupId>org.activiti</groupId>
22 <artifactId>activiti-bpmn-model</artifactId>
23 <version>7.0.0.Beta1</version>
24 </dependency>
25
26 <dependency>
27 <groupId>org.activiti</groupId>
28 <artifactId>activiti-bpmn-converter</artifactId>
29 <version>7.0.0.Beta1</version>
30 </dependency>
31
32 <dependency>
33 <groupId>org.activiti</groupId>
34 <artifactId>activiti-json-converter</artifactId>
35 <version>7.0.0.Beta1</version>
36 </dependency>
37
38 <dependency>
39 <groupId>org.activiti</groupId>
40 <artifactId>activiti-bpmn-layout</artifactId>
41 <version>7.0.0.Beta1</version>
42 </dependency>
43
44 <dependency>
45 <groupId>org.activiti.cloud</groupId>
46 <artifactId>activiti-cloud-services-api</artifactId>
47 <version>7.0.0.Beta1</version>
48 </dependency>
49
50 <dependency>
51 <groupId>mysql</groupId>
52 <artifactId>mysql-connector-java</artifactId>
53 <version>5.1.40</version>
54 </dependency>
55
56 <dependency>
57 <groupId>junit</groupId>
58 <artifactId>junit</artifactId>
59 <version>4.12</version>
60 </dependency>
61
62 <!-- log start -->
63 <dependency>
64 <groupId>log4j</groupId>
65 <artifactId>log4j</artifactId>
66 <version>${log4j.version}</version>
67 </dependency>
68 <dependency>
69 <groupId>org.slf4j</groupId>
70 <artifactId>slf4j-api</artifactId>
71 <version>${slf4j.version}</version>
72 </dependency>
73 <dependency>
74 <groupId>org.slf4j</groupId>
75 <artifactId>slf4j-log4j12</artifactId>
76 <version>${slf4j.version}</version>
77 </dependency>
78 <!-- log end -->
79
80 <dependency>
81 <groupId>org.mybatis</groupId>
82 <artifactId>mybatis</artifactId>
83 <version>3.4.5</version>
84 </dependency>
85
86 <dependency>
87 <groupId>commons-dbcp</groupId>
88 <artifactId>commons-dbcp</artifactId>
89 <version>1.4</version>
90 </dependency>
91
92 </dependencies>
93
94
95
96 <repositories>
97 <repository>
98 <id>alfresco</id>
99 <name>Activiti Releases</name>
100 <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
101 <releases>
102 <enabled>true</enabled>
103 </releases>
104 </repository>
105 </repositories>
activiti.cfg.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd 8 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 9 10 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 11 <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 12 <property name="url" value="jdbc:mysql://localhost:3306/activiti" /> 13 <property name="username" value="root" /> 14 <property name="password" value="root" /> 15 <property name="maxActive" value="3" /> 16 <property name="maxIdle" value="1" /> 17 </bean> 18 19 <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> 20 <property name="dataSource" ref="dataSource"></property> 21 <property name="databaseSchemaUpdate" value="true"/> 22 </bean> 23 24 25 </beans>
配置数据源和processEngineConfiguration
processEngineConfiguration 用来创建ProcessEngine
databaseSchemaUpdate 数据表的设计策略
false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。
create-drop: 构建流程引擎时创建数据库表, 关闭流程引擎时删除这些表。
drop-create:先删除表再创建表。
create: 构建流程引擎时创建数据库表, 关闭流程引擎时不删除这些表
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
创建数据库
1 public void testGenTable(){
2 //创建processEngineConfiguration
3 ProcessEngineConfiguration configuration =
4 ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
5
6 //创建ProcessEngine
7 ProcessEngine processEngine = configuration.buildProcessEngine();
8
9 System.out.println(processEngine);
10
11 }
创建25张表
Activiti 的表都以 ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对
应。
ACT_RE_*: 'RE'表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,
规则,等等)。
ACT_RU_*: 'RU'表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,
等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删
除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI_*: 'HI'表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等
等。
ACT_GE_*: GE 表示 general。 通用数据, 用于不同场景下
架构图

Service
Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口
| RepositoryService | activiti 的资源管理类 |
| RuntimeService | activiti 的流程运行管理类 |
| TaskService | activiti 的任务管理类 |
| HistoryService | activiti 的历史管理类 |
| ManagerService | activiti 的引擎管理类 |
创建bpmn文件
1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 2 <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:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" 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="m1540200341676" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema"> 3 <process id="holiday" isClosed="false" isExecutable="true" name="请假流程" processType="None"> 4 <startEvent id="_2" name="StartEvent"/> 5 <userTask activiti:assignee="zhangsan" activiti:exclusive="true" id="_3" name="填写请假申请单"/> 6 <userTask activiti:assignee="lishi" activiti:exclusive="true" id="_4" name="部门经理审批"/> 7 <userTask activiti:assignee="wangwu" activiti:exclusive="true" id="_5" name="总经理审批"/> 8 <endEvent id="_6" name="EndEvent"/> 9 <sequenceFlow id="_7" sourceRef="_2" targetRef="_3"/> 10 <sequenceFlow id="_8" sourceRef="_3" targetRef="_4"/> 11 <sequenceFlow id="_9" sourceRef="_4" targetRef="_5"/> 12 <sequenceFlow id="_10" sourceRef="_5" targetRef="_6"/> 13 </process> 14 <bpmndi:BPMNDiagram documentation="background=#FFFFFF;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram"> 15 <bpmndi:BPMNPlane bpmnElement="holiday"> 16 <bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2"> 17 <omgdc:Bounds height="32.0" width="32.0" x="280.0" y="45.0"/> 18 <bpmndi:BPMNLabel> 19 <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/> 20 </bpmndi:BPMNLabel> 21 </bpmndi:BPMNShape> 22 <bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3"> 23 <omgdc:Bounds height="55.0" width="85.0" x="255.0" y="140.0"/> 24 <bpmndi:BPMNLabel> 25 <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/> 26 </bpmndi:BPMNLabel> 27 </bpmndi:BPMNShape> 28 <bpmndi:BPMNShape bpmnElement="_4" id="Shape-_4"> 29 <omgdc:Bounds height="55.0" width="85.0" x="255.0" y="245.0"/> 30 <bpmndi:BPMNLabel> 31 <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/> 32 </bpmndi:BPMNLabel> 33 </bpmndi:BPMNShape> 34 <bpmndi:BPMNShape bpmnElement="_5" id="Shape-_5"> 35 <omgdc:Bounds height="55.0" width="85.0" x="255.0" y="350.0"/> 36 <bpmndi:BPMNLabel> 37 <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/> 38 </bpmndi:BPMNLabel> 39 </bpmndi:BPMNShape> 40 <bpmndi:BPMNShape bpmnElement="_6" id="Shape-_6"> 41 <omgdc:Bounds height="32.0" width="32.0" x="275.0" y="455.0"/> 42 <bpmndi:BPMNLabel> 43 <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/> 44 </bpmndi:BPMNLabel> 45 </bpmndi:BPMNShape> 46 <bpmndi:BPMNEdge bpmnElement="_7" id="BPMNEdge__7" sourceElement="_2" targetElement="_3"> 47 <omgdi:waypoint x="296.0" y="77.0"/> 48 <omgdi:waypoint x="296.0" y="140.0"/> 49 <bpmndi:BPMNLabel> 50 <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/> 51 </bpmndi:BPMNLabel> 52 </bpmndi:BPMNEdge> 53 <bpmndi:BPMNEdge bpmnElement="_8" id="BPMNEdge__8" sourceElement="_3" targetElement="_4"> 54 <omgdi:waypoint x="297.5" y="195.0"/> 55 <omgdi:waypoint x="297.5" y="245.0"/> 56 <bpmndi:BPMNLabel> 57 <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/> 58 </bpmndi:BPMNLabel> 59 </bpmndi:BPMNEdge> 60 <bpmndi:BPMNEdge bpmnElement="_9" id="BPMNEdge__9" sourceElement="_4" targetElement="_5"> 61 <omgdi:waypoint x="297.5" y="300.0"/> 62 <omgdi:waypoint x="297.5" y="350.0"/> 63 <bpmndi:BPMNLabel> 64 <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/> 65 </bpmndi:BPMNLabel> 66 </bpmndi:BPMNEdge> 67 <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="_5" targetElement="_6"> 68 <omgdi:waypoint x="291.0" y="405.0"/> 69 <omgdi:waypoint x="291.0" y="455.0"/> 70 <bpmndi:BPMNLabel> 71 <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/> 72 </bpmndi:BPMNLabel> 73 </bpmndi:BPMNEdge> 74 </bpmndi:BPMNPlane> 75 </bpmndi:BPMNDiagram> 76 </definitions>
流程定义
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn") //添加bpmn资源
.addClasspathResource("diagram/holiday.png")
.name("请假申请单流程")
.deploy();
启动流程实例
1 /**
2 * 启动流程实例
3 * 1.得到ProcessEngine对象
4 * 2.得到RuntimeService对象
5 * 3.创建流程实例,需要知道流程定义的key
6 *
7 * 背后影响的表
8 * act_hi_actinst 已完成的活动信息
9 * act_hi_identifylink 参与者计划
10 * act_hi_procinst 流程实例
11 * act_hi_taskinst 任务实例
12 * act_ru_execution 执行表
13 * act_ru_identitylink 参与者信息
14 * act_ru_task 任务
15 *
16 */
17 public class ActivitiStartInstance {
18
19 public static void main(String[] args) {
20 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
21 RuntimeService runtimeService = processEngine.getRuntimeService();
22 runtimeService.startProcessInstanceByKey("hoilday");
23
24 }
25
26 }
任务查询
/**
* 查询当前用户的任务列表
* 1.得到ProcessEngine
* 2.得到taskService对象
* 3.根据流程定义id的key,负责人assigine来表示当前用户列表查询
* 4.任务列表的展示
*/
public class TaskQuery {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey("hoilday")
.taskAssignee("lisi")
.singleResult();
System.out.println("流程实例ID"+task.getProcessInstanceId());
System.out.println("任务ID"+task.getId());
System.out.println("任务负责人"+task.getAssignee());
System.out.println("任务名称"+task.getName());
}
}
任务处理
public class TaskComplete {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
taskService.complete("17502"); //任务查询的ID
}
}
合并任务查询和处理工作
/**
* 合并任务查询和任务处理工作
* @param args
*/
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processDefinitionKey("holiday").taskAssignee("wangwu").singleResult();
//处理任务,结合当前用户任务列表查询操作,任务ID
taskService.complete(task.getId());
System.out.println(task.getId());
}
流程定义部署(压缩包方式)
将 holiday.bpmn 和 holiday.png 压缩成 zip 包
//流程定义部署 流程制作出来后要上传到服务器 zip文件更便于上传
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.转化出ZipInputStream流对象
InputStream is = ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/bpmn.zip");
//将 inputstream流转化为ZipInputStream流
ZipInputStream zipInputStream = new ZipInputStream(is);
//3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请假申请单流程")
.deploy();
//4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
概述
ProcessEngineConfigiuration类加载activiti.cfg.xml配置文件
ProcessEngine类 得到Service接口
Service接口
部署流程定义实例
1.单文件 2.zip包
启动流程实例,RuntimeService startProcessInstanceByKey(" key")
查看任务 taskService.createTaskQuery()
完成任务 taskService.complate(task.getId())
完