一. 什么是Flowable
Flowable 是一个基于 Java 的开源工作流引擎,用于实现和管理业务流程。它提供了强大的工作流引擎和一套丰富的工具,使开发人员能够轻松地建模、部署、执行和监控各种类型的业务流程。Flowable 是 Activiti 工作流引擎的一个分支,诞生于 Activiti 项目与 Alfresco 合并后的分裂,继承了 Activiti 的大部分特性并在此基础上进行了进一步的开发和改进。
Flowable 的核心特点包括:
1. 灵活性和可扩展性:
Flowable 提供了灵活且可扩展的工作流引擎,可以根据不同的业务需求定制和扩展业务流程。
2. 图形化建模工具:
Flowable 提供了图形化的流程设计器,使业务分析师和开发人员能够通过拖放元素来建模和编辑业务流程,而不需要编写代码。
3. 规则引擎集成:
Flowable 可以与规则引擎(如 Drools)集成,使业务规则能够直接应用于业务流程中,从而实现更灵活的业务逻辑控制。
4. 支持多种执行环境:
Flowable 支持在多种执行环境中部署和执行流程,包括传统的 Java 应用程序、Spring 应用程序、Java EE 应用服务器等。
5. 全面的监控和管理功能:
Flowable 提供了监控和管理业务流程执行的工具和 API,可以实时跟踪流程实例的执行情况,并对流程进行管理和优化。
总的来说,Flowable 是一个功能强大且灵活的工作流引擎,为开发人员提供了一套完整的工具和 API,用于建模、部署、执行和管理业务流程,帮助企业实现业务流程的自动化和优化。
二. Flowable的安装
1. 资源包: https://github.com/flowable/flowable-engine/releases
7.0版本后的无 ui
2. 对应的流程设计器 官网flowable-ui
3.我们把这个 flowable-ui.war 扔到Tomcat的webapps目录下然后启动Tomcat服务(tomcat9.exe)即可,启动之后会自动在webapps下创建flowable-ui文件夹,里面可配置此flowable的端口号和数据库连接信息
4.如果想要自动创建用到的数据库的表,可在此文件配置数据库连接信息(lib目录下需要放置数据库连接用到的jar包)
4.访问地址:http://localhost:8080/flowable-ui
三. Flowable的基本使用
1. 创建 ProcessEngine(非Spring)环境
1.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Flowable的核心依赖-->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.2</version>
</dependency>
<!-- MySQL的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- 日志相关 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
1.2 获取流程引擎对象
方法执行成功后会在这三张表中记录相关的部署信息
-
act_ge_bytearray:记录流程定义的资源信息。xml和流程图的图片信息
-
act_re_deployment:流程部署表,记录这次的部署行为
-
act_re_procdef:流程定义表,记录这次部署动作对应的流程定义信息
databaseSchemaUpdate:用于设置流程引擎启动关闭时使用的数据库表结构控制策略
-
false
(默认): 当引擎启动时,检查数据库表结构的版本是否匹配库文件版本。版本不匹配时抛出异常。 -
true
: 构建引擎时,检查并在需要时更新表结构。表结构不存在则会创建。 -
create-drop
: 引擎创建时创建表结构,并在引擎关闭时删除表结构
1.3 启动程序,自动创建表
四. SpringBoot 整合 Flowable
1.添加依赖
2.yml配置文件
然后直接启动,服务就会自动初始化数据库
3.部署流程
方法执行成功后会在这三张表中记录相关的部署信息
-
act_ge_bytearray:记录流程定义的资源信息。xml和流程图的图片信息
-
act_re_deployment:流程部署表,记录这次的部署行为
-
act_re_procdef:流程定义表,记录这次部署动作对应的流程定义信息
4.启动流程实例
启动流程需要通过RuntimeService
来实现。同时在启动流程的时候有两个方法可以调用:
-
startProcessInstanceById: 对应于act_re_procdef 表中的id
-
startProcessInstanceByKey: 对应于act_re_procdef 表中的key
每启动一个流程实例那么就会在act_hi_procinst
表中维护一条记录。然后在act_ru_execution
会记录流程的分支
流程定义和流程实例的关系:
-
流程定义:Java中的类
-
流程实例:Java中的对象
-
这时我们可以在
act_ru_task
表中看到对应的记录。act_ru_task
记录的都是当前待办的记录信息
5.流程审批
找到了需要审批的任务。我们就可以根据 taskId
来完成审批的操作
当审批完成后会删除当前记录并继续创建下个活动的记录
五. Service服务
RepositoryService
是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
RuntimeService
Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
TaskService
Activiti的任务管理类。可以从这个类中获取任务的信息。
HistoryService
Flowable的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
ManagementService
Activiti的引擎管理类,提供了对Flowable 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Flowable 系统的日常维护。
六. 数据库
流程部署成功后
方法执行成功后会在这三张表中记录相关的部署信息
-
act_ge_bytearray:记录流程定义的资源信息。xml和流程图的图片信息
-
act_re_deployment:流程部署表,记录这次的部署行为
-
act_re_procdef:流程定义表,记录这次部署动作对应的流程定义信息
启动流程实例后
在act_ru_task
表中看到对应的记录。act_ru_task
记录的都是当前待办的记录信息
启动流程需要通过RuntimeService
来实现。同时在启动流程的时候有两个方法可以调用:
-
startProcessInstanceById: 对应于act_re_procdef 表中的id
-
startProcessInstanceByKey: 对应于act_re_procdef 表中的key
还有一个要注意的:每启动一个流程实例那么就会在act_hi_procinst
表中维护一条记录。然后在act_ru_execution
会记录流程的分支