亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot集成Flowable實(shí)現(xiàn)工作流解讀

 更新時(shí)間:2025年08月12日 09:24:07   作者:Java程序員 擁抱ai  
文章介紹如何通過Flowable與SpringBoot結(jié)合搭建企業(yè)審批系統(tǒng),涵蓋流程設(shè)計(jì)、引擎集成、業(yè)務(wù)交互及全生命周期管理,實(shí)現(xiàn)可視化建模、低代碼開發(fā),助力中小企業(yè)高效協(xié)作與數(shù)字化轉(zhuǎn)型

一、引言:當(dāng)業(yè)務(wù)流程遇見 Flowable

在企業(yè)級(jí)應(yīng)用中,審批流程是繞不開的核心需求:從請(qǐng)假申請(qǐng)到合同審批,從報(bào)銷流程到項(xiàng)目立項(xiàng),標(biāo)準(zhǔn)化的工作流能顯著提升協(xié)作效率。

傳統(tǒng)硬編碼實(shí)現(xiàn)審批邏輯,往往導(dǎo)致代碼臃腫、維護(hù)困難,而 Flowable 作為輕量級(jí)工作流引擎,與 Spring Boot 的結(jié)合堪稱 “天作之合”。

本文將從 0 到 1 搭建一個(gè)完整的審批系統(tǒng),涵蓋流程設(shè)計(jì)、引擎集成、業(yè)務(wù)交互全流程,附可運(yùn)行的生產(chǎn)級(jí)源碼。

二、Flowable 核心概念:重新定義流程管理

1. 三大核心組件

  • 流程引擎(Process Engine):

Flowable 的心臟,負(fù)責(zé)解析流程定義、管理流程實(shí)例、調(diào)度任務(wù)

  • 流程定義(Process Definition):

可視化的流程藍(lán)圖,通過 BPMN 2.0 標(biāo)準(zhǔn)定義節(jié)點(diǎn)(開始 / 結(jié)束事件、用戶任務(wù)、網(wǎng)關(guān)等)

  • 任務(wù)(Task):

流程執(zhí)行過程中產(chǎn)生的待辦事項(xiàng),包含辦理人、截止時(shí)間、表單數(shù)據(jù)等屬性

2. 核心優(yōu)勢(shì)

  • 輕量化:

獨(dú)立于 Spring 的引擎實(shí)現(xiàn),最小依賴僅 2MB

  • 兼容性:

完全兼容 Activiti 5/6 流程文件,支持多數(shù)據(jù)庫(kù)(MySQL/PostgreSQL/Oracle)

  • 擴(kuò)展性:

提供 Java API、REST 接口、表單引擎、決策表等擴(kuò)展模塊

三、實(shí)戰(zhàn)準(zhǔn)備:搭建開發(fā)環(huán)境

1. 創(chuàng)建 Spring Boot 項(xiàng)目

<!-- pom.xml 依賴 -->  
<dependencies>  
    <!-- Flowable核心依賴 -->  
    <dependency>  
        <groupId>org.flowable</groupId>  
        <artifactId>flowable-spring-boot-starter-process</artifactId>  
        <version>6.8.0</version>  
    </dependency>  
    <!-- 數(shù)據(jù)庫(kù)依賴(以MySQL為例) -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
    </dependency>  
    <!-- Web模塊 -->  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
</dependencies>  

2. 配置數(shù)據(jù)庫(kù)與引擎

# application.yml  
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/flowable_demo?useSSL=false&serverTimezone=Asia/Shanghai  
    username: root  
    password: 123456  
  flowable:  
    database-schema-update: true  # 自動(dòng)創(chuàng)建/更新數(shù)據(jù)庫(kù)表  
    check-process-definitions: true  # 啟動(dòng)時(shí)檢查流程定義  
    async-executor-activate: false  # 禁用異步執(zhí)行器(簡(jiǎn)化開發(fā))  

四、流程建模:用 Flowable Designer 畫審批藍(lán)圖

1. 設(shè)計(jì)請(qǐng)假審批流程

節(jié)點(diǎn)說明

  • 開始事件(Start Event)
  • 用戶任務(wù)(User Task):部門經(jīng)理審批
  • 排他網(wǎng)關(guān)(Exclusive Gateway):根據(jù)審批結(jié)果分支
  • 結(jié)束事件(End Event)

2. 導(dǎo)出流程文件

將設(shè)計(jì)好的流程保存為 leave-process.bpmn20.xml,放置在 src/main/resources/processes/ 目錄下,核心定義如下:

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">  
  <process id="leaveProcess" name="請(qǐng)假流程">  
    <startEvent id="startEvent" />  
    <userTask id="managerApproval" name="部門經(jīng)理審批">  
      <extensionElements>  
        <flowable:assignee>manager</flowable:assignee>  <!-- 辦理人變量 -->  
      </extensionElements>  
    </userTask>  
    <exclusiveGateway id="approvalGate" name="審批結(jié)果" />  
    <endEvent id="approveEnd" name="審批通過" />  
    <endEvent id="rejectEnd" name="審批拒絕" />  
    <!-- 流程連線定義 -->  
  </process>  
</definitions>  

五、核心代碼實(shí)現(xiàn):從引擎集成到業(yè)務(wù)交互

1. 流程服務(wù)層(核心邏輯)

import org.flowable.engine.*;  
import org.flowable.engine.runtime.ProcessInstance;  
import org.flowable.task.api.Task;  
import org.springframework.stereotype.Service;  
@Service  
public class LeaveProcessService {  
    private final ProcessEngine processEngine;  
    public LeaveProcessService(ProcessEngine processEngine) {  
        this.processEngine = processEngine;  
    }  
    // 1. 發(fā)起請(qǐng)假流程  
    public String startProcess(String applicant, String reason, int days) {  
        RuntimeService runtimeService = processEngine.getRuntimeService();  
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(  
            "leaveProcess",  // 流程定義Key  
            "process_" + UUID.randomUUID(),  // 流程實(shí)例ID  
            Map.of(  
                "applicant", applicant,  // 流程變量  
                "reason", reason,  
                "days", days  
            )  
        );  
        return processInstance.getId();  
    }  
    // 2. 處理審批任務(wù)  
    public void completeTask(String taskId, String assignee, boolean approved) {  
        TaskService taskService = processEngine.getTaskService();  
        Task task = taskService.createTaskQuery()  
            .taskId(taskId)  
            .singleResult();  
        taskService.claim(taskId, assignee);  // 認(rèn)領(lǐng)任務(wù)  
        taskService.complete(taskId, Map.of("approved", approved));  // 提交審批結(jié)果  
    }  
    // 3. 查詢用戶待辦任務(wù)  
    public List<Task> getTasks(String assignee) {  
        return processEngine.getTaskService()  
            .createTaskQuery()  
            .taskAssignee(assignee)  
            .orderByTaskCreateTime()  
            .desc()  
            .list();  
    }  
}  

2. 控制器層(REST 接口)

import org.springframework.web.bind.annotation.*;  
@RestController  
@RequestMapping("/process")  
public class LeaveProcessController {  
    private final LeaveProcessService processService;  
    // 發(fā)起流程  
    @PostMapping("/start")  
    public ResponseData startProcess(  
        @RequestParam String applicant,  
        @RequestParam String reason,  
        @RequestParam int days  
    ) {  
        String processId = processService.startProcess(applicant, reason, days);  
        return ResponseData.success("流程啟動(dòng)成功", processId);  
    }  
    // 處理任務(wù)  
    @PostMapping("/complete")  
    public ResponseData completeTask(  
        @RequestParam String taskId,  
        @RequestParam String assignee,  
        @RequestParam boolean approved  
    ) {  
        processService.completeTask(taskId, assignee, approved);  
        return ResponseData.success("任務(wù)處理完成");  
    }  
    // 查詢待辦任務(wù)  
    @GetMapping("/tasks")  
    public ResponseData getTasks(@RequestParam String assignee) {  
        List<Task> tasks = processService.getTasks(assignee);  
        return ResponseData.success("獲取任務(wù)成功", tasks);  
    }  
}  

3. 數(shù)據(jù)庫(kù)表說明

Flowable 自動(dòng)創(chuàng)建以下核心表(以 MySQL 為例):

表名

作用

ACT_RE_PROCDEF

流程定義表

ACT_RU_INSTANCE

運(yùn)行時(shí)流程實(shí)例表

ACT_RU_TASK

運(yùn)行時(shí)任務(wù)表

ACT_HI_PROCINST

歷史流程實(shí)例表

ACT_HI_TASKINST

歷史任務(wù)表

六、深度解析:Flowable 架構(gòu)與 Spring Boot 的化學(xué)反應(yīng)

1. 引擎初始化流程

  • Spring Boot 自動(dòng)配置:

FlowableAutoConfiguration 注冊(cè)核心 Bean(ProcessEngine、RuntimeService 等)

  • 數(shù)據(jù)庫(kù)初始化:

database-schema-update 自動(dòng)創(chuàng)建 52 張表,支持四種策略(false/null/true/create-drop)

  • 流程定義部署:

啟動(dòng)時(shí)掃描classpath:/processes/目錄,自動(dòng)部署 BPMN 文件

2. 事務(wù)管理機(jī)制

  • 與 Spring 事務(wù)集成:

流程操作(啟動(dòng) / 完成任務(wù))自動(dòng)納入 Spring 事務(wù)

  • 隔離級(jí)別:

通過@Transactional注解控制,默認(rèn)使用數(shù)據(jù)庫(kù)默認(rèn)隔離級(jí)別

  • 異常處理:

流程執(zhí)行失敗時(shí)自動(dòng)回滾,歷史表記錄失敗事件

3. 性能優(yōu)化點(diǎn)

// 優(yōu)化查詢性能(添加索引)  
@PostConstruct  
public void createIndex() {  
    ManagementService managementService = processEngine.getManagementService();  
    managementService.createIndex("ACT_IDX_TASK_ASSIGNEE", "ACT_RU_TASK", "ASSIGNEE_");  
}  

七、生產(chǎn)環(huán)境最佳實(shí)踐

1. 流程版本管理

// 部署新版本流程(保留歷史版本)  
RepositoryService repositoryService = processEngine.getRepositoryService();  
repositoryService.createDeployment()  
    .name("請(qǐng)假流程V2.0")  
    .addClasspathResource("processes/leave-process-v2.bpmn20.xml")  
    .deploy();  

2. 表單集成方案

  • 內(nèi)嵌表單:

在 BPMN 中定義flowable:formField,通過TaskService.getTaskFormData()獲取表單元數(shù)據(jù)

  • 外置表單:

使用 Flowable Form 引擎,支持 HTML/CSS/JavaScript 自定義表單

3. 監(jiān)控與審計(jì)

// 查詢流程執(zhí)行歷史  
HistoryService historyService = processEngine.getHistoryService();  
List<HistoricProcessInstance> instances = historyService  
    .createHistoricProcessInstanceQuery()  
    .processInstanceBusinessKey("process_123")  
    .list();  

4. 安全加固

  • 權(quán)限控制:

通過 Spring Security 限制 API 訪問,流程變量加密存儲(chǔ)

  • 防 SQL 注入:

所有用戶輸入?yún)?shù)使用 MyBatis 的#{}占位符,避免拼接 SQL

八、總結(jié):重新定義流程開發(fā)范式

通過 Spring Boot 與 Flowable 的深度集成,我們實(shí)現(xiàn)了:

  • 可視化流程建模:

業(yè)務(wù)人員可獨(dú)立設(shè)計(jì)審批流程,減少技術(shù)依賴

  • 低代碼開發(fā):

核心業(yè)務(wù)邏輯與流程引擎解耦,代碼量減少 60% 以上

  • 全生命周期管理:

從流程啟動(dòng)到歷史追溯,提供完整的審計(jì)能力

在數(shù)字化轉(zhuǎn)型的今天,工作流引擎不再是 “奢侈品”。Flowable 與 Spring Boot 的組合,讓中小企業(yè)也能快速搭建專業(yè)級(jí)審批系統(tǒng)。掌握這套技術(shù)棧,不僅能提升開發(fā)效率,更能讓你在企業(yè)架構(gòu)設(shè)計(jì)中占據(jù)先機(jī) —— 畢竟,清晰的流程,才是高效協(xié)作的基石

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java虛擬機(jī)執(zhí)行引擎知識(shí)總結(jié)

    Java虛擬機(jī)執(zhí)行引擎知識(shí)總結(jié)

    這篇文章主要介紹了有關(guān)Java虛擬機(jī)執(zhí)行引擎的知識(shí),文中實(shí)例簡(jiǎn)單易懂,方便大家更好的學(xué)習(xí),有興趣的朋友可以了解下
    2020-06-06
  • 最新SpringCloud?Stream消息驅(qū)動(dòng)講解

    最新SpringCloud?Stream消息驅(qū)動(dòng)講解

    SpringCloud Stream 是一個(gè)構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架,通過 SpringCloud Stream 連接消息中間件,以實(shí)現(xiàn)消息事件驅(qū)動(dòng),這篇文章主要介紹了SpringCloud?Stream消息驅(qū)動(dòng),需要的朋友可以參考下
    2022-11-11
  • Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例

    Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例

    這篇文章主要介紹了Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例,讀寫分離,基本的原理是讓主數(shù)據(jù)庫(kù)處理事務(wù)性增、改、刪操作,而從數(shù)據(jù)庫(kù)處理SELECT查詢操作,數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2023-10-10
  • Java中indexOf函數(shù)示例詳解

    Java中indexOf函數(shù)示例詳解

    Java String 類的 indexOf() 方法返回指定字符串中指定字符或字符串第一次出現(xiàn)的位置,這篇文章主要介紹了Java中indexOf函數(shù)詳解,需要的朋友可以參考下
    2024-01-01
  • SpringAop中AspectJ框架的切入點(diǎn)表達(dá)式

    SpringAop中AspectJ框架的切入點(diǎn)表達(dá)式

    這篇文章主要介紹了SpringAop中AspectJ框架的切入點(diǎn)表達(dá)式,AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架,Spring2.0以后新增了對(duì)AspectJ切點(diǎn)表達(dá)式支持,@AspectJ 是AspectJ1.5新增功能,通過JDK5注解技術(shù),允許直接在Bean類中定義切面,需要的朋友可以參考下
    2023-08-08
  • Eclipse在線安裝hibernate插件

    Eclipse在線安裝hibernate插件

    這篇文章主要介紹了Eclipse在線安裝hibernate插件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2019-04-04
  • Springboot整合Mybatispuls的實(shí)例詳解

    Springboot整合Mybatispuls的實(shí)例詳解

    這篇文章主要介紹了Springboot整合Mybatispuls的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java線程休眠的5種方法

    Java線程休眠的5種方法

    這篇文章主要介紹了Java線程休眠的5種方法,分別是Thread.sleep、TimeUnit、wait、Condition、LockSupport,下面文章將對(duì)這五種方法進(jìn)行詳細(xì)講解,需要的小伙伴可以參考一下
    2022-05-05
  • Spring Security如何使用URL地址進(jìn)行權(quán)限控制

    Spring Security如何使用URL地址進(jìn)行權(quán)限控制

    這篇文章主要介紹了Spring Security如何使用URL地址進(jìn)行權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • springboot+thymeleaf+shiro標(biāo)簽的實(shí)例

    springboot+thymeleaf+shiro標(biāo)簽的實(shí)例

    這篇文章主要介紹了springboot+thymeleaf+shiro標(biāo)簽的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論