activiti 7 + springboot2(六) SpringBoot2 整合 Activiti7
activiti 7 的springboot插件能自动创建数据表,自动部署设计好的流程,不需要我们像前面那样代码创建数据库和部署流程。
(一)首先 pom.xml 文件中引入相关的依赖,具体依赖如下所示:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.activiti.examples</groupId> <artifactId>activiti-3</artifactId> <version>1.0</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <activiti-dependencies.version>7.1.24</activiti-dependencies.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.activiti.dependencies</groupId> <artifactId>activiti-dependencies</artifactId> <version>${activiti-dependencies.version}</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- mysql数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <release>${java.version}</release> <showDeprecation>true</showDeprecation> <showWarnings>true</showWarnings> <optimize>true</optimize> </configuration> </plugin> </plugins> </build> <!-- 添加私服仓库地址,否则找不到包 --> <repositories> <repository> <id>alfresco</id> <name>Activiti Releases</name> <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> </project>
(二)springboot 的配置文件 application.yml中添加相关的配置:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/platform_activiti?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false username: root password: pass hikari: minimum-idle: 5 maximum-pool-size: 20 connection-test-query: SELECT 1 activiti:
database-schema-update: true # 开启历史库 db-history-used: true history-level: audit
参数说明:
databaseSchemaUpdate配置项可以设置流程引擎启动和关闭时数据库执行的策略。 databaseSchemaUpdate有以下四个值:
- false:false为默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
- true:设置为该值后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
- create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
- drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。
history-level对于历史数据,保存到何种粒度,Activiti提供了history-level属性对其进行配置。history-level属性有点像log4j的日志输出级别,该属性有以下四个值:
- none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
- activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
- audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
- full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
db-history-used为true表示使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立,则流程图及运行节点无法展示
(三)流程资源
资源文件放在 resources/processes 目录下,activiti程序启动会自动发布流程
(四)编写Applocation主程序
package com.activiti.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ActivitiApplication { public static void main(String[] args) { SpringApplication.run(ActivitiApplication.class, args); } }
运行程序,从控制台输出中可以看到,自动创建了数据库,并且发布了"请假申请"的流程
(五)编写基于SpringBootTest的测试程序
package com.activiti.example; import org.activiti.api.process.runtime.ProcessRuntime; import org.activiti.api.task.runtime.TaskRuntime; import org.activiti.engine.*; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.task.Task; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest public class ActivitiTest { @Autowired private RepositoryService repositoryService; @Autowired private TaskService taskService; @Autowired private RuntimeService runtimeService; @Autowired private HistoryService historyService; /** * 启动一个实例 */ @Test public void startProcessInstance() { System.out.println("Number of process definitions : "+ repositoryService.createProcessDefinitionQuery().count()); System.out.println("Number of tasks : " + taskService.createTaskQuery().count()); runtimeService.startProcessInstanceByKey("myProcess_1"); } /** * 查询用户的任务列表 */ @Test public void taskQuery() { //根据流程定义的key,负责人assignee来实现当前用户的任务列表查询 List<Task> list = taskService.createTaskQuery() .processDefinitionKey("myProcess_1") .taskAssignee("john") .list(); if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("执行对象ID:"+task.getExecutionId()); System.out.println("流程定义ID:"+task.getProcessDefinitionId()); System.out.println("getOwner:"+task.getOwner()); System.out.println("getCategory:"+task.getCategory()); System.out.println("getDescription:"+task.getDescription()); System.out.println("getFormKey:"+task.getFormKey()); Map<String, Object> map = task.getProcessVariables(); for (Map.Entry<String, Object> m : map.entrySet()) { System.out.println("key:" + m.getKey() + " value:" + m.getValue()); } for (Map.Entry<String, Object> m : task.getTaskLocalVariables().entrySet()) { System.out.println("key:" + m.getKey() + " value:" + m.getValue()); } } } } /** * 完成任务 */ @Test public void completeTask(){ //任务ID String taskId = "967465fe-3367-11ea-a057-30b49ec7161f"; taskService.complete(taskId); System.out.println("完成任务:任务ID:"+taskId); } /** * 历史活动实例查询 */ @Test public void queryHistoryTask() { List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery() // 创建历史活动实例查询 .processInstanceId("9671cdea-3367-11ea-a057-30b49ec7161f") // 执行流程实例id .orderByTaskCreateTime() .asc() .list(); for (HistoricTaskInstance hai : list) { System.out.println("活动ID:" + hai.getId()); System.out.println("流程实例ID:" + hai.getProcessInstanceId()); System.out.println("活动名称:" + hai.getName()); System.out.println("办理人:" + hai.getAssignee()); System.out.println("开始时间:" + hai.getStartTime()); System.out.println("结束时间:" + hai.getEndTime()); } } }