SpringBoot集成Activiti7工作流引擎的示例代碼
一. 版本信息
- IntelliJ IDEA 2023.3.6
- JDK 17
- Activiti 7
二. IDEA依賴插件安裝
安裝 BPM流程圖插件,如果IDEA的版本超過2020,則不支持actiBPM插件。我的IDEA是2023版本我裝的是 Activiti BPMN visualizer 插件。
在Plugins 搜索 Activiti BPMN visualizer 安裝
創(chuàng)建BPMN文件
使用視圖模式打開bpmn.xml
三. 創(chuàng)建SpringBoot 集成 activiti7
使用 IDEA 創(chuàng)建SpringBoot項(xiàng)目
設(shè)置項(xiàng)目參數(shù)
在 pom.xml 依賴配置文件中添加(Mysql,Lombok,activiti7)依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com</groupId> <artifactId>activiti-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>activiti-demo</name> <description>activiti-demo</description> <properties> <java.version>17</java.version> </properties> <dependencies> <!-- web依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mysql依賴 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.2.0</version> </dependency> <!-- lombok依賴 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- mybatis數(shù)據(jù)訪問層 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.7</version> </dependency> <!-- activiti7 工作流引擎依賴 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </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> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
創(chuàng)建本地連接的數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫 activiti
CREATE DATABASE `activiti` /*!40100 DEFAULT CHARACTER SET utf8 */;
創(chuàng)建數(shù)據(jù)庫表 user
-- activiti.`user` definition CREATE TABLE `user` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `NAME` varchar(100) DEFAULT NULL COMMENT '名稱', `AGE` varchar(100) DEFAULT NULL COMMENT '年齡', `CREATED_BY` varchar(32) DEFAULT NULL COMMENT '創(chuàng)建人名稱', `CREATED_TIME` datetime DEFAULT NULL COMMENT '創(chuàng)建時間', `CREATED_ID` varchar(32) DEFAULT NULL COMMENT '創(chuàng)建人ID', `UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人名稱', `UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新時間', `UPDATED_ID` varchar(32) DEFAULT NULL COMMENT '更新人ID', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用戶信息表';
添加一條測試數(shù)據(jù)
INSERT INTO activiti.`user` (ID, NAME, AGE, CREATED_BY, CREATED_TIME, CREATED_ID, UPDATED_BY, UPDATED_TIME, UPDATED_ID) VALUES(1, '小王', '24', NULL, NULL, NULL, NULL, NULL, NULL);
添加 application.yml 配置文件
spring: application: name: activiti-demo datasource: #url切換數(shù)據(jù)庫之后如果對應(yīng)數(shù)據(jù)庫名稱和路徑有變動,需要修改url url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
添加 activiti.cfg.xml 配置文件(文件名不能隨便改)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans [ <!ELEMENT beans (bean)*> <!ATTLIST beans xmlns CDATA #REQUIRED xmlns:xsi CDATA #REQUIRED xsi:schemaLocation CDATA #REQUIRED> <!ELEMENT bean (property)*> <!ATTLIST bean id CDATA #REQUIRED class CDATA #REQUIRED> <!ELEMENT property (#PCDATA)> <!ATTLIST property name CDATA #REQUIRED value CDATA #REQUIRED> ]> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- processEnqine Activiti 的流程引擎 --> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true"/> <property name="jdbcUsername" value="root"/> <property name="jdbcPassword" value="root"/> <!-- activiti 數(shù)據(jù)庫表處理策略 --> <!-- databaseSchemaUpdate 屬性的值可以設(shè)置為以下幾種 --> <!-- none:這是默認(rèn)值,表示不對數(shù)據(jù)庫模式做任何變更,應(yīng)用程序啟動時不會檢查數(shù)據(jù)庫表結(jié)構(gòu)是否與實(shí)體類匹配--> <!-- true:設(shè)置為 true 時,Spring會在應(yīng)用程序啟動時檢查數(shù)據(jù)庫表結(jié)構(gòu),并在發(fā)現(xiàn)不匹配時自動創(chuàng)建或修改表結(jié)構(gòu)以匹配實(shí)體類定義。這相當(dāng)于執(zhí)行了數(shù)據(jù)庫遷移--> <!-- create:與 true 類似,但 create 會在每次啟動時刪除并重新創(chuàng)建表,這可能會導(dǎo)致數(shù)據(jù)丟失,因此使用時需要謹(jǐn)慎--> <!-- create-drop:在每次啟動應(yīng)用程序時創(chuàng)建表,在關(guān)閉應(yīng)用程序時刪除表。這通常用于測試環(huán)境--> <!-- validate:在啟動時驗(yàn)證數(shù)據(jù)庫表結(jié)構(gòu)是否與實(shí)體類定義匹配,如果不匹配則拋出異常,但不會自動進(jìn)行任何更改--> <property name="databaseSchemaUpdate" value="true"/> </bean> </beans>
啟動SpringBoot項(xiàng)目成功
開始添加一個查詢數(shù)據(jù)測試接口(Controller,Service,Mapper,Entity)
Controller類
package com.activitidemo.act.controller; import com.activitidemo.act.entity.UserEntity; import com.activitidemo.act.service.impl.UserServiceImp; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 前端控制器 * </p> * * @author ningbeibei * @since 2024-09-26 */ @RestController @RequestMapping("/user-entity") public class UserController { @Resource private UserServiceImp userService; @PostMapping("/user") public Object getUser(@RequestBody UserEntity user){ QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id",user.getId()); return userService.getBaseMapper().selectList(queryWrapper); } }
Service 類
package com.activitidemo.act.service; import com.activitidemo.act.entity.UserEntity; import com.baomidou.mybatisplus.extension.service.IService; /** * @author ningbeibei * @since 2024-09-26 */ public interface UserService extends IService<UserEntity> { }
package com.activitidemo.act.service.impl; import com.activitidemo.act.mapper.UserMapper; import com.activitidemo.act.service.UserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import com.activitidemo.act.entity.UserEntity; /** * <p> * 服務(wù)實(shí)現(xiàn)類 * </p> * * @author ningbeibei * @since 2024-09-26 */ @Service public class UserServiceImp extends ServiceImpl<UserMapper, UserEntity> implements UserService { }
Mapper 類
package com.activitidemo.act.mapper; import com.activitidemo.act.entity.UserEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; /** * <p> * Mapper 接口 * </p> * * @author ningbeibei * @since 2024-09-26 */ @Mapper public interface UserMapper extends BaseMapper<UserEntity> { }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.activitidemo.act.entity.UserEntity"> </mapper>
Entity 類
package com.activitidemo.act.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.time.LocalDateTime; /** * @author ningbeibei * @since 2024-09-26 */ @Getter @Setter @TableName("user") public class UserEntity implements Serializable { private static final long serialVersionUID = 1L; @TableField("ID") private Integer id; @TableField("NAME") private String name; @TableField("AGE") private int age; @TableField("CREATED_BY") private String createdBy; @TableField("CREATED_TIME") private LocalDateTime createdTime; @TableField("CREATED_ID") private String createdId; @TableField("UPDATED_BY") private String updatedBy; @TableField("UPDATED_TIME") private LocalDateTime updatedTime; @TableField("UPDATED_ID") private String updatedId; }
目錄結(jié)構(gòu)
使用Postman接口測試工具,測試接口是否正常
四. Activiti 使用步驟
Activiti 主要流程操作步驟:
定義流程:按照BPMN的規(guī)范,使用流程定義工具,用流程符號把整個流程描述出來。
部署流程:把畫好的流程定義文件,加載到數(shù)據(jù)庫中,生成表的數(shù)據(jù)。
啟動流程:使用 java 代碼來操作數(shù)據(jù)庫表中的內(nèi)容。
處理任務(wù):操作流程當(dāng)中的各個任務(wù)。
1. 定義流程
2. 初始庫表、定義、部署、操作任務(wù)代碼
創(chuàng)建測試類
測試代碼:
package com.activitidemo; import org.activiti.engine.HistoryService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Comment; import org.activiti.engine.task.Task; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; @SpringBootTest class ActivitiDemoApplicationTests { // 創(chuàng)建 ProcessEngine 對象 // private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // /** // * 初始化數(shù)據(jù)庫表:第一種方式 // */ // @Test // public void testInitOne() { // ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // System.err.println("processEngine = " + processEngine); // } /** * 初始化數(shù)據(jù)庫表 * 通過讀取 activiti.cfg.xml 配置文件 */ @Test public void testInitTwo() { ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = configuration.buildProcessEngine(); System.err.println("processEngine = " + processEngine); } /** * 流程部署 */ @Test public void testDeploy() { // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取 repositoryService 對象 RepositoryService repositoryService = processEngine.getRepositoryService(); // 進(jìn)行部署 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("process/leave.bpmn20.xml") .addClasspathResource("process/leave.bpmn20.png") .name("請假流程") .deploy(); // 輸出部署的一些信息 System.out.println("流程部署ID:" + deployment.getId()); System.out.println("流程部署名稱:" + deployment.getName()); System.out.println("流程部署成功"); } /** * 啟動流程實(shí)例 */ @Test public void testStartProcess() { // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取 runtimeService 對象 RuntimeService runtimeService = processEngine.getRuntimeService(); // 1.根據(jù)流程定義的key啟動流程實(shí)例,這個key是在定義bpmn的時候設(shè)置的 ProcessInstance instance = runtimeService.startProcessInstanceByKey("leave"); // 2.根據(jù)流程定義id啟動流程實(shí)例 // ProcessInstance instance = runtimeService.startProcessInstanceById("leave:1:4"); // 獲取流程實(shí)例的相關(guān)信息 System.out.println("流程定義的id = " + instance.getProcessDefinitionId()); System.out.println("流程實(shí)例的id = " + instance.getId()); System.out.println("啟動流程成功 "); } /** * 查詢待辦任務(wù) */ @Test public void testSelectTodoTaskList() { String assignee = "李四"; // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取指定用戶審核任務(wù) TaskService taskService = processEngine.getTaskService(); // 使用面對對象方式查詢數(shù)據(jù)庫 List<Task> tasks = taskService.createTaskQuery() .processDefinitionKey("leave") .taskAssignee(assignee) // 返回多個結(jié)果 .list(); // 只返回一個結(jié)果 // .singleResult(); // 自定義 sql 查詢 // taskService.createNativeTaskQuery(); // 獲取流程實(shí)例的相關(guān)信息 for (Task task : tasks) { System.out.println("流程定義的id = " + task.getProcessDefinitionId()); System.out.println("流程實(shí)例的id = " + task.getProcessInstanceId()); System.out.println("任務(wù)id = " + task.getId()); System.out.println("任務(wù)名稱 = " + task.getName()); } } /** * 指定用戶去完成任務(wù)待辦:多人審批在這操作,改變審核人名稱就行了 */ @Test public void testCompleteTask() { String assignee = "李四"; // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取指定用戶審核任務(wù) TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery() .processDefinitionKey("leave") .taskAssignee(assignee) .list(); if (tasks != null && !tasks.isEmpty()){ // 當(dāng)前流程圖所限制,只能做審核同意的動作 for (Task task : tasks) { taskService.complete(task.getId()); } } } /** * 審批添加備注 */ @Test public void testAddComment() { String assignee = "張三"; // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取指定用戶審核任務(wù) TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery() .processDefinitionKey("leave") .taskAssignee(assignee) .list(); if (tasks != null && !tasks.isEmpty()) { // 當(dāng)前流程圖所限制,只能做審核同意的動作 for (Task task : tasks) { // 添加備注 taskService.addComment(task.getId(), task.getProcessInstanceId(), assignee + "表示同意"); taskService.complete(task.getId()); } } } /** * 查詢審批歷史 */ @Test public void testSelectHistoryTask() { String processInstanceId = "2501"; String assignee = "張三"; // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 查看歷史信息 HistoryService historyService = processEngine.getHistoryService(); // 獲取指定用戶審核任務(wù) TaskService taskService = processEngine.getTaskService(); // 獲取歷史審核信息 List<HistoricActivityInstance> userTask = historyService.createHistoricActivityInstanceQuery() .activityType("userTask") // 指定實(shí)例的id .processInstanceId(processInstanceId) .taskAssignee(assignee) .finished() .list(); for (HistoricActivityInstance instance : userTask) { System.out.println("任務(wù)名稱 = " + instance.getActivityName()); System.out.println("任務(wù)開始時間 = " + instance.getStartTime()); System.out.println("任務(wù)結(jié)束時間 = " + instance.getEndTime()); System.out.println("任務(wù)耗時 = " + instance.getDurationInMillis()); // 獲取審批批注信息 List<Comment> taskComments = taskService.getTaskComments(instance.getTaskId()); if (!taskComments.isEmpty()){ System.out.println("審批批注 = " + taskComments.get(0).getFullMessage()); } } } /** * 查詢流程相關(guān)信息 */ @Test public void testDefinitionQuery() { // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取倉庫服務(wù) RepositoryService repositoryService = processEngine.getRepositoryService(); // 獲取流程定義集合 List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("leave") // 最新的一個版本 .latestVersion() .list(); // 遍歷集合 for (ProcessDefinition definition : processDefinitionList) { System.out.println("流程定義id = " + definition.getId()); System.out.println("流程定義名稱 = " + definition.getName()); System.out.println("流程定義key = " + definition.getKey()); System.out.println("流程定義版本 = " + definition.getVersion()); System.out.println("流程部署id = " + definition.getDeploymentId()); System.out.println("==============="); } } /** * 資源文件下載 */ @Test public void testDownloadResource() throws IOException { // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取倉庫服務(wù) RepositoryService repositoryService = processEngine.getRepositoryService(); // 獲取流程定義集合 List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("leave") // 按照版本降序 .orderByProcessDefinitionVersion() // 降序 .desc() .list(); // 獲取最新那個 ProcessDefinition definition = list.get(0); // 獲取部署id String deploymentId = definition.getDeploymentId(); // 獲取bpmn的輸入流 InputStream bpmnInputStream = repositoryService.getResourceAsStream(deploymentId, definition.getResourceName()); // 獲取png的輸入流 // InputStream pngInputStream = repositoryService.getResourceAsStream(deploymentId, definition.getDiagramResourceName()); String resourcePath = "C:/Users/ASUS/Desktop/" + File.separator + definition.getResourceName(); File file = new File(resourcePath); if (!file.exists()) { file.getParentFile().mkdirs(); } String diagramResourcePath = "C:/Users/ASUS/Desktop/" + File.separator + definition.getDiagramResourceName(); file = new File(diagramResourcePath); if (!file.exists()) { file.getParentFile().mkdirs(); } //復(fù)制文件 FileCopyUtils.copy(bpmnInputStream, Files.newOutputStream(Paths.get(resourcePath))); // FileCopyUtils.copy(pngInputStream, Files.newOutputStream(Paths.get(diagramResourcePath))); } /** * 刪除已經(jīng)部署的流程定義 */ @Test public void testDeleteDeploy() { // 刪除已經(jīng)部署的流程定義 String deploymentId = "45001"; // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取倉庫服務(wù) RepositoryService repositoryService = processEngine.getRepositoryService(); // 刪除流程定義,如果改流程定義已有流程實(shí)例啟動,則會報(bào)錯 // repositoryService.deleteDeployment(deploymentId); // 設(shè)置 true,級聯(lián)刪除流程定義,即使有啟動的實(shí)例也可以刪除 repositoryService.deleteDeployment(deploymentId, true); } /** * 啟動流程,需要進(jìn)行 BusinessKey 綁定流程實(shí)例 */ @Test public void testStartBindBusinessKey() { String businessKey = "1"; // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); // 根據(jù)流程定義的key啟動流程實(shí)例,這個key是在定義bpmn的時候設(shè)置的 // 在啟動流程的時候?qū)I(yè)務(wù)key加進(jìn)去 ProcessInstance instance = runtimeService.startProcessInstanceByKey("leave", businessKey); // 獲取流程實(shí)例的相關(guān)信息 System.out.println("流程定義id = " + instance.getProcessDefinitionId()); System.out.println("流程實(shí)例id = " + instance.getId()); System.out.println("業(yè)務(wù)標(biāo)識 = " + instance.getBusinessKey()); } /** * 跑到下一個節(jié)點(diǎn),需要進(jìn)行審批了,此時需要獲取 BusinessKey 進(jìn)而獲取請假單信息 */ @Test public void testGetBusinessKey() { // 1、獲取李四的待辦信息 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); List<Task> task = taskService.createTaskQuery() .taskAssignee("李四") .processDefinitionKey("leave") .list(); // 2、獲取 businessKey // 獲取流程實(shí)例id String processInstanceId = task.get(1).getProcessInstanceId(); RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); String businessKey = processInstance.getBusinessKey(); System.out.println("業(yè)務(wù)標(biāo)識 = " + businessKey); } /** * 流程定義掛起與激活 */ @Test public void testSuspendAllProcessInstance() { // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 獲取倉庫服務(wù) RepositoryService repositoryService = processEngine.getRepositoryService(); // 獲取流程定義對象 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("leave") .singleResult(); boolean suspended = processDefinition.isSuspended(); // 輸出流程定義狀態(tài) System.out.println("流程定義狀態(tài):" + (suspended ? "已掛起" : "已激活")); String processDefinitionId = processDefinition.getId(); if (suspended) { repositoryService.activateProcessDefinitionById(processDefinitionId, true, null); System.out.println("流程id:" + processDefinitionId + "已激活"); } else { repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null); System.out.println("流程id:" + processDefinitionId + "已掛起"); } } /** * 流程實(shí)例掛起與激活 */ @Test public void testProcessInstance() { // 創(chuàng)建 ProcessEngine 對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); // 獲取流程定義對象 List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery() .processDefinitionKey("leave") .list(); // 遍歷集合 for (ProcessInstance processInstance : processInstanceList) { boolean suspended = processInstance.isSuspended(); // 輸出流程定義狀態(tài) System.out.println("流程實(shí)例狀態(tài):" + processInstance + "," + (suspended ? "已掛起" : "已激活")); String processDefinitionId = processInstance.getId(); if (suspended) { runtimeService.activateProcessInstanceById(processDefinitionId); System.out.println("流程實(shí)例id:" + processDefinitionId + "已激活"); } else { runtimeService.suspendProcessInstanceById(processDefinitionId); System.out.println("流程實(shí)例id:" + processDefinitionId + "已掛起"); } } } }
到此這篇關(guān)于SpringBoot集成Activiti7工作流引擎的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot Activiti7 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解
這篇文章主要介紹了SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解,Aspect(切面)通常是一個類,里面可以定義切入點(diǎn)和通知(切面 = 切點(diǎn)+通知),execution()是最常用的切點(diǎn)函數(shù),需要的朋友可以參考下2024-01-01Java并發(fā)編程之JUC并發(fā)核心AQS同步隊(duì)列原理剖析
AbstractQueuedSynchronizer 簡稱 AQS,可能我們幾乎不會直接去使用它,但它卻是 JUC 的核心基礎(chǔ)組件,支撐著 java 鎖和同步器的實(shí)現(xiàn),大神 Doug Lea 在設(shè)計(jì) JUC 包時希望能夠抽象一個基礎(chǔ)且通用的組件以支撐上層模塊的實(shí)現(xiàn),AQS 應(yīng)運(yùn)而生2021-09-09java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開
這篇文章主要為大家介紹了java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別
Java事務(wù)的類型有三種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù),本文詳細(xì)介紹了JDBC事務(wù)與JTA分布式事務(wù),有需要的可以了解一下。2016-11-11Java實(shí)現(xiàn)微信掃碼登入的實(shí)例代碼
這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登入功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06