Flowable技术

Flowable 教程

一、Flowable 简介

Flowable 是一个基于 BPMN 2.0 规范的轻量级业务流程引擎,支持流程定义、部署、执行与监控。其核心优势包括:

  • 灵活扩展:可嵌入 Java 应用或通过 REST API 调用。
  • 可视化建模:支持 BPMN 流程设计,结合 Flowable Modeler 实现流程配置可视化。
  • 数据持久化:通过数据库表管理流程定义(ACT_RE_*)、运行时数据(ACT_RU_*)、历史数据(ACT_HI_*)等。

二、环境搭建

1. 创建 Maven 项目

pom.xml 中添加依赖:

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.7.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>

2. 配置数据库

application.yml 中配置数据源:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flowable?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  flowable:
    database-schema-update: true  # 自动创建/更新数据库表

3. 初始化流程引擎

方式一:硬编码配置
ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
    .setJdbcUrl("jdbc:mysql://localhost:3306/flowable")
    .setJdbcUsername("root")
    .setJdbcPassword("root")
    .setJdbcDriver("com.mysql.cj.jdbc.Driver")
    .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine = cfg.buildProcessEngine();
方式二:配置文件 flowable.cfg.xml

resources 目录下创建 flowable.cfg.xml

<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 spring-beans.xsd">
    <bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/flowable"/>
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="root"/>
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>

通过 ProcessEngines.getDefaultProcessEngine() 获取引擎实例。

三、核心表结构

分类表名说明
流程定义ACT_RE_PROCDEF已部署的流程定义
运行时数据ACT_RU_TASK运行时任务
历史数据ACT_HI_PROCINST历史流程实例
用户与组ACT_ID_USER用户表
通用数据ACT_GE_PROPERTY系统属性

四、实战示例:请假流程

1. 创建 BPMN 流程定义

resources/processes 目录下创建 leave-process.bpmn20.xml

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:flowable="http://flowable.org/bpmn">
    <process id="leaveProcess" name="请假流程">
        <startEvent id="start" />
        <userTask id="submitForm" name="提交请假单" flowable:assignee="${initiator}"/>
        <userTask id="leaderApprove" name="领导审批" flowable:candidateGroups="leaders"/>
        <exclusiveGateway id="approveDecision" />
        <endEvent id="approveEnd" name="审批通过"/>
        <endEvent id="rejectEnd" name="审批拒绝"/>
        
        <sequenceFlow sourceRef="start" targetRef="submitForm"/>
        <sequenceFlow sourceRef="submitForm" targetRef="leaderApprove"/>
        <sequenceFlow sourceRef="leaderApprove" targetRef="approveDecision"/>
        <sequenceFlow sourceRef="approveDecision" targetRef="approveEnd">
            <conditionExpression>${approved == true}</conditionExpression>
        </sequenceFlow>
        <sequenceFlow sourceRef="approveDecision" targetRef="rejectEnd">
            <conditionExpression>${approved == false}</conditionExpression>
        </sequenceFlow>
    </process>
</definitions>

2. 部署流程定义

RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
    .addClasspathResource("processes/leave-process.bpmn20.xml")
    .deploy();

3. 启动流程实例

RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("initiator", "张三");  // 设置发起人
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);

4. 处理任务

TaskService taskService = processEngine.getTaskService();
// 查询待办任务
Task task = taskService.createTaskQuery().taskAssignee("李四").singleResult();
// 完成任务并设置变量
Map<String, Object> params = new HashMap<>();
params.put("approved", true);
taskService.complete(task.getId(), params);

五、高级特性

1. 动态任务分配

通过表达式或监听器动态设置处理人:

<userTask id="handleTask" flowable:assignee="${taskHandler}" />

或通过 TaskListener 实现:

public class TaskAssignmentListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        String assignee = calculateAssignee(delegateTask);
        delegateTask.setAssignee(assignee);
    }
}

2. 多实例任务

配置并行或串行多实例:

<userTask id="multiInstanceTask" flowable:flowable:multiInstanceLoopCharacteristics="sequential" />

3. 事件与错误处理

  • 定时事件:通过 flowable:timer 配置。
  • 错误边界事件:捕获流程中的异常并跳转到指定节点。

六、日志与监控

1. 日志配置

pom.xml 中添加 SLF4J 和 Log4j 依赖,并在 resources 目录下创建 log4j.properties

log4j.rootLogger=DEBUG, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n

2. 监控工具

  • Flowable Modeler:可视化设计流程。
  • Flowable Admin:管理流程定义、实例和任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值