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())
完