欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot集成Activiti7工作流引擎的示例代碼

 更新時間:2024年11月20日 11:53:41   作者:動物園首領(lǐng)  
本文主要介紹了SpringBoot集成Activiti7工作流引擎的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一. 版本信息

  • 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&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;useSSL=false&amp;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)文章

  • Java實(shí)現(xiàn)暴力匹配算法

    Java實(shí)現(xiàn)暴力匹配算法

    暴力匹配算法是一種簡單的字符串匹配算法,本文主要介紹了Java實(shí)現(xiàn)暴力匹配算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解

    SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解

    這篇文章主要介紹了SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解,Aspect(切面)通常是一個類,里面可以定義切入點(diǎn)和通知(切面 = 切點(diǎn)+通知),execution()是最常用的切點(diǎn)函數(shù),需要的朋友可以參考下
    2024-01-01
  • 深入Java注解原理Annotation

    深入Java注解原理Annotation

    這篇文章主要介紹了深入Java注解原理Annotation,注解可以附加在package,class,method,field等上面,可相當(dāng)于添加了額外的輔助信息,可以通過反射機(jī)制編程實(shí)現(xiàn)對這些元數(shù)據(jù)的訪問,需要的朋友可以參考下
    2023-10-10
  • Java并發(fā)編程之JUC并發(fā)核心AQS同步隊(duì)列原理剖析

    Java并發(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-09
  • Java中的SimpleDateFormat使用詳解

    Java中的SimpleDateFormat使用詳解

    SimpleDateFormat 是一個以國別敏感的方式格式化和分析數(shù)據(jù)的具體類。這篇文章主要介紹了Java中的SimpleDateFormat使用詳解,需要的朋友可以參考下
    2017-03-03
  • SWT(JFace)體驗(yàn)之打開多個Form

    SWT(JFace)體驗(yàn)之打開多個Form

    SWT(JFace)體驗(yàn)之打開多個Form的實(shí)現(xiàn)代碼。
    2009-06-06
  • Java面試問題知識點(diǎn)總結(jié)

    Java面試問題知識點(diǎn)總結(jié)

    本文主要介紹并且整理了Java面試知識點(diǎn)總結(jié),,有需要的小伙伴可以參考下
    2017-04-04
  • java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開

    java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開

    這篇文章主要為大家介紹了java線程池參數(shù)位置導(dǎo)致的奪命故障宿主機(jī)打不開的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別

    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)微信掃碼登入的實(shí)例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登入功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06

最新評論