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()); } } }