SpringBoot集成Activiti7工作流引擎的示例代碼
一. 版本信息
- IntelliJ IDEA 2023.3.6
- JDK 17
- Activiti 7
二. IDEA依賴插件安裝
安裝 BPM流程圖插件,如果IDEA的版本超過(guò)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ù)訪問(wèn)層 -->
<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>
<!-- 模塊測(cè)試依賴 -->
<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ù)庫(kù)
創(chuàng)建數(shù)據(jù)庫(kù) activiti
CREATE DATABASE `activiti` /*!40100 DEFAULT CHARACTER SET utf8 */;
創(chuàng)建數(shù)據(jù)庫(kù)表 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)建時(shí)間', `CREATED_ID` varchar(32) DEFAULT NULL COMMENT '創(chuàng)建人ID', `UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人名稱', `UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新時(shí)間', `UPDATED_ID` varchar(32) DEFAULT NULL COMMENT '更新人ID', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用戶信息表';
添加一條測(cè)試數(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ù)庫(kù)之后如果對(duì)應(yīng)數(shù)據(jù)庫(kù)名稱和路徑有變動(dòng),需要修改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ù)庫(kù)表處理策略 -->
<!-- databaseSchemaUpdate 屬性的值可以設(shè)置為以下幾種 -->
<!-- none:這是默認(rèn)值,表示不對(duì)數(shù)據(jù)庫(kù)模式做任何變更,應(yīng)用程序啟動(dòng)時(shí)不會(huì)檢查數(shù)據(jù)庫(kù)表結(jié)構(gòu)是否與實(shí)體類匹配-->
<!-- true:設(shè)置為 true 時(shí),Spring會(huì)在應(yīng)用程序啟動(dòng)時(shí)檢查數(shù)據(jù)庫(kù)表結(jié)構(gòu),并在發(fā)現(xiàn)不匹配時(shí)自動(dòng)創(chuàng)建或修改表結(jié)構(gòu)以匹配實(shí)體類定義。這相當(dāng)于執(zhí)行了數(shù)據(jù)庫(kù)遷移-->
<!-- create:與 true 類似,但 create 會(huì)在每次啟動(dòng)時(shí)刪除并重新創(chuàng)建表,這可能會(huì)導(dǎo)致數(shù)據(jù)丟失,因此使用時(shí)需要謹(jǐn)慎-->
<!-- create-drop:在每次啟動(dòng)應(yīng)用程序時(shí)創(chuàng)建表,在關(guān)閉應(yīng)用程序時(shí)刪除表。這通常用于測(cè)試環(huán)境-->
<!-- validate:在啟動(dòng)時(shí)驗(yàn)證數(shù)據(jù)庫(kù)表結(jié)構(gòu)是否與實(shí)體類定義匹配,如果不匹配則拋出異常,但不會(huì)自動(dòng)進(jìn)行任何更改-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
啟動(dòng)SpringBoot項(xiàng)目成功

開始添加一個(gè)查詢數(shù)據(jù)測(cè)試接口(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接口測(cè)試工具,測(cè)試接口是否正常

四. Activiti 使用步驟
Activiti 主要流程操作步驟:
定義流程:按照BPMN的規(guī)范,使用流程定義工具,用流程符號(hào)把整個(gè)流程描述出來(lái)。
部署流程:把畫好的流程定義文件,加載到數(shù)據(jù)庫(kù)中,生成表的數(shù)據(jù)。
啟動(dòng)流程:使用 java 代碼來(lái)操作數(shù)據(jù)庫(kù)表中的內(nèi)容。
處理任務(wù):操作流程當(dāng)中的各個(gè)任務(wù)。
1. 定義流程


2. 初始庫(kù)表、定義、部署、操作任務(wù)代碼
創(chuàng)建測(cè)試類

測(cè)試代碼:
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 對(duì)象
// private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// /**
// * 初始化數(shù)據(jù)庫(kù)表:第一種方式
// */
// @Test
// public void testInitOne() {
// ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// System.err.println("processEngine = " + processEngine);
// }
/**
* 初始化數(shù)據(jù)庫(kù)表
* 通過(guò)讀取 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 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 獲取 repositoryService 對(duì)象
RepositoryService repositoryService = processEngine.getRepositoryService();
// 進(jìn)行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("process/leave.bpmn20.xml")
.addClasspathResource("process/leave.bpmn20.png")
.name("請(qǐng)假流程")
.deploy();
// 輸出部署的一些信息
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署名稱:" + deployment.getName());
System.out.println("流程部署成功");
}
/**
* 啟動(dòng)流程實(shí)例
*/
@Test
public void testStartProcess() {
// 創(chuàng)建 ProcessEngine 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 獲取 runtimeService 對(duì)象
RuntimeService runtimeService = processEngine.getRuntimeService();
// 1.根據(jù)流程定義的key啟動(dòng)流程實(shí)例,這個(gè)key是在定義bpmn的時(shí)候設(shè)置的
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leave");
// 2.根據(jù)流程定義id啟動(dòng)流程實(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("啟動(dòng)流程成功 ");
}
/**
* 查詢待辦任務(wù)
*/
@Test
public void testSelectTodoTaskList() {
String assignee = "李四";
// 創(chuàng)建 ProcessEngine 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 獲取指定用戶審核任務(wù)
TaskService taskService = processEngine.getTaskService();
// 使用面對(duì)對(duì)象方式查詢數(shù)據(jù)庫(kù)
List<Task> tasks = taskService.createTaskQuery()
.processDefinitionKey("leave")
.taskAssignee(assignee)
// 返回多個(gè)結(jié)果
.list();
// 只返回一個(gè)結(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 對(duì)象
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)前流程圖所限制,只能做審核同意的動(dòng)作
for (Task task : tasks) {
taskService.complete(task.getId());
}
}
}
/**
* 審批添加備注
*/
@Test
public void testAddComment() {
String assignee = "張三";
// 創(chuàng)建 ProcessEngine 對(duì)象
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)前流程圖所限制,只能做審核同意的動(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 對(duì)象
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ù)開始時(shí)間 = " + instance.getStartTime());
System.out.println("任務(wù)結(jié)束時(shí)間 = " + instance.getEndTime());
System.out.println("任務(wù)耗時(shí) = " + 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 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 獲取倉(cāng)庫(kù)服務(wù)
RepositoryService repositoryService = processEngine.getRepositoryService();
// 獲取流程定義集合
List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("leave")
// 最新的一個(gè)版本
.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 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 獲取倉(cāng)庫(kù)服務(wù)
RepositoryService repositoryService = processEngine.getRepositoryService();
// 獲取流程定義集合
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("leave")
// 按照版本降序
.orderByProcessDefinitionVersion()
// 降序
.desc()
.list();
// 獲取最新那個(gè)
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 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 獲取倉(cāng)庫(kù)服務(wù)
RepositoryService repositoryService = processEngine.getRepositoryService();
// 刪除流程定義,如果改流程定義已有流程實(shí)例啟動(dòng),則會(huì)報(bào)錯(cuò)
// repositoryService.deleteDeployment(deploymentId);
// 設(shè)置 true,級(jí)聯(lián)刪除流程定義,即使有啟動(dòng)的實(shí)例也可以刪除
repositoryService.deleteDeployment(deploymentId, true);
}
/**
* 啟動(dòng)流程,需要進(jìn)行 BusinessKey 綁定流程實(shí)例
*/
@Test
public void testStartBindBusinessKey() {
String businessKey = "1";
// 創(chuàng)建 ProcessEngine 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根據(jù)流程定義的key啟動(dòng)流程實(shí)例,這個(gè)key是在定義bpmn的時(shí)候設(shè)置的
// 在啟動(dòng)流程的時(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)識(shí) = " + instance.getBusinessKey());
}
/**
* 跑到下一個(gè)節(jié)點(diǎn),需要進(jìn)行審批了,此時(shí)需要獲取 BusinessKey 進(jìn)而獲取請(qǐng)假單信息
*/
@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)識(shí) = " + businessKey);
}
/**
* 流程定義掛起與激活
*/
@Test
public void testSuspendAllProcessInstance() {
// 創(chuàng)建 ProcessEngine 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 獲取倉(cāng)庫(kù)服務(wù)
RepositoryService repositoryService = processEngine.getRepositoryService();
// 獲取流程定義對(duì)象
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 對(duì)象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 獲取流程定義對(duì)象
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringAop自定義切面注解、自定義過(guò)濾器及ThreadLocal詳解
這篇文章主要介紹了SpringAop自定義切面注解、自定義過(guò)濾器及ThreadLocal詳解,Aspect(切面)通常是一個(gè)類,里面可以定義切入點(diǎn)和通知(切面 = 切點(diǎn)+通知),execution()是最常用的切點(diǎn)函數(shù),需要的朋友可以參考下2024-01-01
Java并發(fā)編程之JUC并發(fā)核心AQS同步隊(duì)列原理剖析
AbstractQueuedSynchronizer 簡(jiǎn)稱 AQS,可能我們幾乎不會(huì)直接去使用它,但它卻是 JUC 的核心基礎(chǔ)組件,支撐著 java 鎖和同步器的實(shí)現(xiàn),大神 Doug Lea 在設(shè)計(jì) JUC 包時(shí)希望能夠抽象一個(gè)基礎(chǔ)且通用的組件以支撐上層模塊的實(shí)現(xiàn),AQS 應(yīng)運(yùn)而生2021-09-09
SWT(JFace)體驗(yàn)之打開多個(gè)Form
SWT(JFace)體驗(yàn)之打開多個(gè)Form的實(shí)現(xiàn)代碼。2009-06-06
Java面試問(wèn)題知識(shí)點(diǎn)總結(jié)
本文主要介紹并且整理了Java面試知識(shí)點(diǎn)總結(jié),,有需要的小伙伴可以參考下2017-04-04
java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開
這篇文章主要為大家介紹了java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開的問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別
Java事務(wù)的類型有三種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù),本文詳細(xì)介紹了JDBC事務(wù)與JTA分布式事務(wù),有需要的可以了解一下。2016-11-11
Java實(shí)現(xiàn)微信掃碼登入的實(shí)例代碼
這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登入功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

