Flowable工作流引擎:Spring Boot集成

一、环境准备
  1. 技术栈

    • JDK 11+
    • Spring Boot 2.7.x
    • Flowable 6.8.0
    • MySQL 8.0
  2. 依赖配置

    pom.xml 中添加核心依赖:

    xml 复制代码
    <dependencies>
        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Flowable Starter -->
        <dependency>
            <groupId>org.flowable</groupId>
            <artifactId>flowable-spring-boot-starter</artifactId>
            <version>6.8.0</version>
        </dependency>
        <!-- MySQL Driver -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
    </dependencies>
    
    AI写代码xml
    12345678910111213141516171819
二、数据库配置

application.yml 中[配置 MySQL](连接:

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flowable?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  flowable:
    # 数据库表自动更新
    database-schema-update: true
    # 历史数据级别(full记录最完整)
    history-level: full
    # 关闭异步执行器(开发阶段)
    async-executor-activate: false

AI写代码yaml
12345678910111213
三、流程定义与部署
  1. 设计 BPMN 流程

    使用 [Flowable Modeler] (bpmn-js) 或在线工具设计请假流程,保存为 leave-request.bpmn20.xml,结构:

    ini 复制代码
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
      <process id="leaveProcess" name="请假流程">
        <startEvent id="start" />
        <userTask id="applyTask" name="提交申请" />
        <exclusiveGateway id="decision" />
        <userTask id="managerApproval" name="经理审批" />
        <endEvent id="end" />
        <sequenceFlow sourceRef="start" targetRef="applyTask" />
        <sequenceFlow sourceRef="applyTask" targetRef="decision" />
        <sequenceFlow sourceRef="decision" targetRef="managerApproval" conditionExpression="${days <= 3}" />
        <sequenceFlow sourceRef="managerApproval" targetRef="end" />
      </process>
    </definitions>
    
    AI写代码xml
    12345678910111213
  2. 部署流程

    将 BPMN 文件放入 src/main/resources/processes/ 目录,Spring Boot 启动时自动部署。或通过代码动态部署:

    java 复制代码
    @Autowired
    private RepositoryService repositoryService;
    
    public void deployProcess() {
        InputStream bpmnStream = new FileInputStream("path/to/leave-request.bpmn20.xml");
        repositoryService.createDeployment()
            .addInputStream("leave-request.bpmn20.xml", bpmnStream)
            .deploy();
    }
    
    AI写代码java
    运行
    123456789
四、流程实例操作
  1. 启动流程实例

    typescript 复制代码
    @Autowired
    private RuntimeService runtimeService;
    
    public String startProcess() {
        Map<String, Object> variables = new HashMap<>();
        variables.put("days", 3); // 流程变量
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
        return instance.getId();
    }
    
    AI写代码java
    运行
    123456789
  2. 查询与完成任务

    typescript 复制代码
    @Autowired
    private TaskService taskService;
    
    public void completeTask(String taskId) {
        Map<String, Object> variables = new HashMap<>();
        variables.put("approved", true);
        taskService.complete(taskId, variables);
    }
    
    public List<Task> getTasks(String assignee) {
        return taskService.createTaskQuery()
            .taskAssignee(assignee)
            .list();
    }
    
    AI写代码java
    运行
    1234567891011121314
五、动态任务分配
  1. 静态分配

    在 BPMN 中直接指定执行人:

    ini 复制代码
    <userTask id="managerApproval" name="经理审批" flowable:assignee="manager1" />
    
    AI写代码xml
    1
  2. 动态分配

    通过表达式或 API 动态指定:

    javascript 复制代码
    // 在启动流程时设置变量
    variables.put("nextApprover", "user123");
    
    // 在BPMN中使用表达式
    <userTask id="task" name="动态任务" flowable:assignee="${nextApprover}" />
    
    AI写代码java
    运行
    12345
六、历史数据查询
scss 复制代码
@Autowired
private HistoryService historyService;

public List<HistoricProcessInstance> getHistoryInstances() {
    return historyService.createHistoricProcessInstanceQuery()
        .finished()
        .list();
}

public List<HistoricTaskInstance> getHistoryTasks(String processInstanceId) {
    return historyService.createHistoricTaskInstanceQuery()
        .processInstanceId(processInstanceId)
        .list();
}

AI写代码java
运行
1234567891011121314
七、扩展功能
  1. 会签任务

    使用 flowable:candidateUsersflowable:candidateGroups 实现多用户审批:

    xml 复制代码
    <userTask id="ccApproval" name="会签审批">
      <documentation>需所有成员审批通过</documentation>
      <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="ccList" flowable:elementVariable="ccUser">
        <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 1}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    
    AI写代码xml
    123456
  2. 邮件通知

    集成 Spring Mail,在任务分配时发送通知:

    scss 复制代码
    @Autowired
    private JavaMailSender mailSender;
    
    public void sendNotification(String to, String taskId) {
        mailSender.send(new SimpleMailMessage() {{
            setTo(to);
            setSubject("新任务待处理");
            setText("您有新任务,ID: " + taskId);
        }});
    }
    
    AI写代码java
    运行
    12345678910
八、Docker 部署
  1. 打包应用

    go 复制代码
    mvn clean package
    
    AI写代码bash
    1
  2. 构建 Docker 镜像

    bash 复制代码
    FROM openjdk:11-jre
    COPY target/flowable-demo.jar /app.jar
    EXPOSE 8080
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
    AI写代码dockerfile
    1234
  3. 运行容器

    arduino 复制代码
    docker build -t flowable-demo .
    docker run -d -p 8080:8080 --name flowable-app flowable-demo
相关推荐
Java水解6 小时前
Spring AI Alibaba 入门教程:快速集成大模型到Spring Boot应用
后端·spring
王中阳Go背后的男人6 小时前
订单支付后库存不扣减,如何用RabbitMQ来优化?
后端
IT_陈寒6 小时前
Vite 5新特性解析:10个提速技巧让你的开发效率翻倍 🚀
前端·人工智能·后端
yuuki2332336 小时前
【数据结构】单链表的实现
c语言·数据结构·后端
刘一说6 小时前
深入理解 Spring Boot Web 开发中的全局异常统一处理机制
前端·spring boot·后端
塔能物联运维6 小时前
物联网边缘节点数据缓存优化与一致性保障技术
java·后端·物联网·spring·缓存
IT_陈寒7 小时前
Vite 5震撼发布!10个新特性让你的开发效率飙升200% 🚀
前端·人工智能·后端
JohnYan7 小时前
工作笔记 - 记一次PG数据导入和清理
后端·postgresql