保存成功
订阅成功
保存失败,请重试
提交成功

省级政法项目 Flowable 实战

.
查看本场Chat

前言

读者可能需要进行快速验证或快速应用。为此,将在每节的开始部分,直接给出实现代码;在章节后面,再提出实现原理或扩展方向。

版本说明

  • JDK 1.8.0_121
  • Flowable 6.5.0
  • MySQL 5.7.15
  • Spring Tool Suite 4

工作流基本介绍,介绍 Flowable 的兄弟姊妹

关于工作流的基本概念,本文不做详细解释。纵观生活中,处处皆是流程;比如:车辆年检、房屋过户、员工入职、休假申请、合同审批、小孩上学等等。

传统的办事流程大多是采用纸质办理,对于终端用户,不能很好的对流程进行监控,对于组织内部,不能很好地对办事效率进行评估。对于开发者而言,流程中的一个小变更,将可能导致代码的整体修改。

为此,工作流引擎应运而生。工作流引擎通过可视化方式,对流程进行设计和编排。通过相关 API 对流程进行操作;如流程启动,任务办理,耗时统计,流程监控,任务追踪等操作。工作流引擎专注于流程的设计、编排,实现了和业务数据的解耦。为此,当需求发生变更时,开发者可以更灵活的进行按需修改。不必担心“牵一发而动全身”的问题。

笔者在之前的项目中使用过 Camunda,在使用过程中,感觉其代码不够灵活,社区也没有 Flowable 丰富,为此,在后续的项目中,已完成 Camunda 到 Flowable 的过渡。

虽然是两种工作流引擎,但他们都是从 Activiti 发展而来的,在他们的源码中,也能看到 Activiti 的影子。

在技术选型上,推荐大家使用 Flowable。

官方社区

Spring 集成 Flowable,常见 Service 介绍

快速集成

项目以 Maven 构建,其 POM 文件如下:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yuxinglab</groupId>
    <artifactId>flowable-stu</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>flowable-stu</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath />
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- 工作流 -->
        <dependency>
            <groupId>org.flowable</groupId>
            <artifactId>flowable-spring-boot-starter-process</artifactId>
            <version>6.5.0</version>
        </dependency>
        <!-- 测试包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

application.yml 文件配置如下:

logging:
  level:
    #root: debug
    com.yuxinglab: debug
  file: logs/debug.log
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    ### 注意 nullCatalogMeansCurrent=true
    url: jdbc:mysql:///flowablestu?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&nullCatalogMeansCurrent=true
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
flowable:
  check-process-definitions: false
  activity-font-name: 宋体
  annotation-font-name: 宋体
  label-font-name: 宋体

单元测试类:

package com.yuxinglab.flowable.stu;

import org.flowable.engine.ProcessEngine;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest(classes = FlowableStartUp.class)
@RunWith(SpringRunner.class)
public class IntegrateTest {

    @Autowired
    private ProcessEngine engine;

    @Test
    public void testIntegrate() {
        System.out.println(engine.getName());
    }

}
代码解析

通过使用 Spring 的单元测试,加载默 Flowable 的 ProcessEngine 类,该类是工作流的核心入口类,其在启动时很重要的一不工作,就是创建或更新表结构。

如果执行正常,将在 MySQL 数据库中生成如下的表结构:

在这里插入图片描述

其中:

  • act_hi 开头的表,主要用来存储历史资源信息,如历史流程实例信息
  • act_id 开头的表,主要用来存储 Flowable 的用户组信息,如用户组信息
  • act_re 开头的表,主要用来存储运行时资源信息,如代办任务信息
问题整理

1. 在上面的配置文件中指定了 jdbc.url 的 nullCatalogMeansCurrent 参数为 true。为什么要加上它?

互动评论
评论
芳了个方1 个月前
写的很好,给了我较多的思路和底气去说服领导使用该框架
评论
江雨行(作者)25 天前
你可以看下我的中国式文章,比这个要更灵活。
评论
花枝1 个月前
请问 提交人提交任务后,如何确保流程流转到对应的部门经理,避开其他部门的经理?
评论
江雨行(作者)1 个月前
任务的办理人,是在任务领取时传递的,默认情况下一定不会被别的用户看到。
评论
Qu🎈4 个月前
都跑不起来,怎么知道来龙去脉。服气作者
评论
GitChat_631回复江雨行(作者)7 天前
运行起来了,谢谢。
评论
江雨行(作者)3 个月前
方法级别的,想运行起来,自己写单元测试
评论
Nirvana1 年前
本文的代码有上传github嘛
评论
九哥(作者)1 年前
公司项目,不太方便,有问题可私信讨论
评论
在路上1 年前
本文的代码可以给一份完整的吗
评论
九哥(作者)1 年前
公司项目,不太方便,有问题可私信讨论
评论
查看更多