工作流之Flowable
一、定义
工作流(Workflow)是一种自动化处理业务过程的方法,用于定义、执行和管理业务任务的顺序。它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。Flowable是一个基于Java的开源BPM(业务流程管理)框架,它主要基于Activiti中的一些组件,并在此基础上进行了扩展和升级。
二、功能
Flowable的功能非常强大,涵盖了业务流程管理的多个方面。以下是其主要功能的详细介绍:
1. 流程定义:
- Flowable支持BPMN 2.0标准,使得流程定义更加规范和易于维护。
- 通过Flowable的工作流设计器,用户可以直观地定义工作流程、任务、网关、决策等元素。
2. 流程引擎配置:
- Flowable提供了灵活的流程引擎配置选项,允许用户根据需要调整工作流的执行方式。
- 用户可以选择合适的流程引擎,如Activiti、Camunda等,并进行相应的配置和集成。
3. 流程执行:
- Flowable的执行器能够确保流程的正确执行,并根据流程定义自动完成任务和判断。
- 流程实例启动后,会按照预定义的流程进行执行,包括任务完成、网关判断、决策结果等。
4. 流程监控:
- Flowable提供了丰富的监控工具,允许用户实时监控和管理流程。
- 用户可以查看流程状态、任务完成情况、性能指标等,以便及时发现和解决流程中存在的问题。
5. 任务管理:
- Flowable的任务服务提供了任务分配、委派、转派、认领以及完成等功能。
- 通过任务服务,用户可以方便地管理任务的生命周期,确保任务的正确执行。
6. 历史数据管理:
- Flowable支持历史数据的记录和查询,包括流程实例、任务、变量、活动和步骤等。
- 通过历史数据管理,用户可以分析流程的执行情况,优化流程设计。
7. 用户和组管理:
- Flowable提供了用户和组的管理功能,允许用户创建、更新、删除和查询用户和组的信息。
- 这有助于实现基于角色的访问控制,确保流程的安全性。
8. RESTful API:
- Flowable通过RESTful API提供服务,方便与其他系统集成。
- 用户可以通过编写调用API的客户端程序来使用Flowable引擎服务。
三、特点
Flowable作为一个轻量级的业务流程引擎,具有以下显著特点:
1. 可扩展性:
- Flowable提供了一组可扩展的API,使得开发人员可以根据需要自定义工作流。
- 它支持与多种应用程序集成,如Spring和Hibernate等,以实现更高级的工作流管理。
2. 易用性:
- Flowable提供了易于使用的API和工具,使得开发人员可以快速构建工作流应用程序。
- 它还提供了直观的Web-based模型设计器,使得非技术人员也可以方便地创建和修改流程定义。
3. 可视化:
- Flowable支持基于Web的图形化编辑器,用户可以直观地设计、部署和监控工作流。
- 它还提供了动态表单设计功能,允许用户根据业务需求定制表单字段和布局。
4. 平台独立性:
- Flowable在设计时避免了与底层系统相关的代码,从而实现平台独立性。
- 它可以部署在不同的云提供商的环境中,并支持基于容器的部署。
5. 高性能:
- Flowable具有高性能工作流建模和执行能力,可以在大量用户和大量数据的情况下快速运行。
- 它通过优化引擎性能和可靠性,确保工作流应用程序的高效和稳定。
6. 灵活性:
- Flowable支持多种流程,并允许用户创建自定义操作,以适应各种业务需求。
- 它还提供了丰富的扩展性和个性化定制能力,可以满足各种复杂场景的需求。
四、应用场景
Flowable工作流引擎适用于多种应用场景,包括但不限于:
1. 企业内部流程管理:
- 如请假审批、报销流程、合同审批等。
- 通过Flowable,企业可以自动化处理这些内部流程,提高工作效率和准确性。
2. 业务流程自动化:
- 如订单处理、物流跟踪、客户服务等。
- Flowable可以自动化处理这些业务流程,减少人工干预和错误率。
3. 复杂业务逻辑处理:
- 如金融交易、保险理赔、供应链管理等。
- 通过Flowable,企业可以处理这些复杂的业务逻辑,优化流程设计和执行方式。
4. 微服务架构集成:
- Flowable可以与微服务架构无缝集成,实现业务流程的自动化和监控。
- 这有助于企业构建更加灵活和可扩展的系统架构。
五、优势
Flowable工作流引擎相比其他同类产品具有以下显著优势:
1. 全面的功能支持:
- Flowable支持BPMN 2.0、CMMN和DMN标准,提供了全面的功能支持。
- 它涵盖了流程定义、流程执行、流程监控、任务管理、历史数据管理等多个方面,满足企业复杂的业务流程管理需求。
2. 优秀的性能表现:
- Flowable具有高性能工作流建模和执行能力,可以在大量用户和大量数据的情况下快速运行。
- 它通过优化引擎性能和可靠性,确保工作流应用程序的高效和稳定。
3. 灵活的扩展性:
- Flowable提供了一组可扩展的API,使得开发人员可以根据需要自定义工作流。
- 它支持与多种应用程序集成,如Spring和Hibernate等,以实现更高级的工作流管理。
4. 直观的可视化工具:
- Flowable提供了直观的Web-based模型设计器和表单设计器,使得非技术人员也可以方便地创建和修改流程定义。
- 这大大降低了使用门槛,提高了工作效率。
5. 强大的社区支持:
- Flowable是一个开源项目,拥有活跃的社区支持和丰富的文档资源。
- 用户可以通过社区获取帮助和支持,共同解决问题和改进产品。
六、架构与组件
Flowable的架构主要分为四部分:工作流引擎、应用程序接口(API)、模型器和任务表单设计器。
1. 工作流引擎:
- Flowable的核心组件,包括运行时引擎和执行引擎。
- 它管理整个流程的生命周期,监控、控制任务的执行以及记录流程实例的状态等信息。
2. 应用程序接口(API):
- 根据RESTful风格,提供给外部系统访问Flowable引擎的接口。
- 用户可以通过编写调用API的客户端程序来使用Flowable引擎服务。
3. 模型器:
- 用于创建和修改流程定义文件,支持基于Web的图形化编辑器。
- 用户可以通过模型器直观地定义工作流程、任务、网关、决策等元素。
4. 任务表单设计器:
- 用于创建和修改任务表单,支持基于Web的表单设计器。
- 用户可以通过表单设计器定制表单字段和布局,以满足业务需求。
七、数据库表结构
Flowable的所有数据库表都以ACT_开头,第二部分是说明表用途的两字符标示符。以下是主要表结构的解释:
1. ACT_RE_:
- 'RE’代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。
- 主要表包括ACT_RE_DEPLOYMENT(部署对象)、ACT_RE_MODEL(基于流程的模型信息)、ACT_RE_PROCDEF(流程定义)等。
2. ACT_RU_:
- 'RU’代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。
- 主要表包括ACT_RU_ACTINST(运行中实例的活动表)、ACT_RU_EXECUTION(运行的实例表)、ACT_RU_TASK(运行中的正常节点任务)等。
3. ACT_HI_:
- 'HI’代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。
- 主要表包括ACT_HI_ACTINST(历史活动实例)、ACT_HI_PROCINST(历史流程实例)、ACT_HI_TASKINST(历史任务实例)等。
4. ACT_GE_:
- 通用数据表,在多处使用。
- 主要表包括ACT_GE_BYTEARRAY(保存流程的bpmn的xml以及流程的Image缩略图等信息)、ACT_GE_PROPERTY(Flowable相关的基本信息)等。
5. ACT_ID_*:
- 表示组织信息,如用户、用户组等。
八、实战应用
以下是使用Flowable进行业务流程管理的一个简单实战应用示例:
1. 添加依赖
在Spring Boot项目中添加Flowable的依赖,以便使用其提供的服务。
<dependencies>
<!-- Spring Boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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.1</version> <!-- 确保使用最新版本 -->
</dependency>
<!-- 数据库驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version> <!-- 确保使用与数据库兼容的版本 -->
</dependency>
</dependencies>
2. 配置数据库
在application.yml
或application.properties
中配置数据库连接信息。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flowable?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT&nullCatalogMeansCurrent=true
username: root
password: root
flowable:
database-schema-update: true # 每次启动时自动创建或更新数据库表
3. 创建流程定义文件
使用Flowable Modeler或其他BPMN工具创建流程定义文件(.bpmn20.xml)。例如,一个简单的请假流程定义文件可能如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
xmlns:flowable="http://flowable.org/bpmn"
targetNamespace="LeaveProcess">
<process id="leaveProcess" name="Leave Process" isExecutable="true">
<startEvent id="startEvent" name="Start" />
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="userTask1" />
<userTask id="userTask1" name="Submit Leave Request" flowable:assignee="employee" />
<sequenceFlow id="flow2" sourceRef="userTask1" targetRef="userTask2" />
<userTask id="userTask2" name="Approve Leave Request" flowable:assignee="manager" />
<sequenceFlow id="flow3" sourceRef="userTask2" targetRef="endEvent" />
<endEvent id="endEvent" name="End" />
</process>
</definitions>
4. 部署流程定义
在Spring Boot项目中编写代码来部署流程定义文件。
import org.flowable.engine.ProcessEngine;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.engine.repository.Deployment;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class FlowableApplication {
public static void main(String[] args) {
SpringApplication.run(FlowableApplication.class, args);
}
@Bean
public ProcessEngine processEngine() {
return ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration()
.buildProcessEngine();
}
@Bean
public CommandLineRunner run(ProcessEngine processEngine) {
return args -> {
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("path/to/your/leaveProcess.bpmn20.xml")
.deploy();
System.out.println("Deployment ID: " + deployment.getId());
};
}
}
5. 启动流程实例
编写代码来启动流程实例并完成任务。
import org.flowable.engine.ProcessEngine;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class FlowableRunner implements CommandLineRunner {
@Autowired
private ProcessEngine processEngine;
@Override
public void run(String... args) throws Exception {
// 启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess");
System.out.println("Process Instance ID: " + processInstance.getId());
// 完成任务
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
while (task != null) {
System.out.println("Task ID: " + task.getId());
System.out.println("Task Name: " + task.getName());
System.out.println("Task Assignee: " + task.getAssignee());
// 假设当前用户是任务分配者,完成任务
taskService.complete(task.getId());
// 查询下一个任务
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
}
System.out.println("Process Instance Ended");
}
}
6. 监控和管理流程
通过Flowable提供的API或Flowable UI来监控和管理流程实例、任务、变量等。
- Flowable API提供了丰富的服务,如
RuntimeService
、TaskService
、HistoryService
等,用于查询和管理流程实例、任务、历史数据等。 - Flowable UI提供了一套基于Web的用户界面,用于直观地监控和管理流程实例、任务、变量等。
7. 自定义和扩展
根据业务需求,可以自定义和扩展Flowable的功能。
- 通过实现Flowable提供的接口或继承其类,可以自定义任务监听器、执行监听器、表单字段类型等。
- 通过编写自定义的Java Delegate或Spring Bean,可以将业务逻辑集成到流程中。
- 通过集成外部系统(如邮件服务、消息队列等),可以实现流程与其他系统的交互。
通过以上步骤,您可以在Spring Boot项目中使用Flowable来构建和管理业务流程。Flowable的灵活性和强大的功能将帮助您实现业务流程的自动化和高效管理。
九、总结
Flowable是一个基于Java的开源BPM框架,它在Activiti的基础上进行了扩展和升级。Flowable提供了全面的功能支持,包括流程定义、执行、监控、任务管理、历史数据管理和用户组管理等。其特点在于可扩展性、易用性、可视化、平台独立性、高性能和灵活性。通过Flowable,企业可以自动化处理内部流程、业务流程以及复杂业务逻辑,提高工作效率和准确性。
在实战应用中,Flowable可以与Spring Boot等框架无缝集成,通过添加依赖、配置数据库、创建流程定义文件、部署流程定义、启动流程实例等步骤,快速构建工作流应用程序。同时,Flowable提供了丰富的API和Web-based模型设计器,使得开发人员和非技术人员都可以方便地创建和修改流程定义。
此外,Flowable还支持多种流程,并允许用户创建自定义操作,以适应各种业务需求。其强大的社区支持和丰富的文档资源也为用户提供了极大的便利。
总之,Flowable是一个功能强大、易于使用、灵活可扩展的业务流程管理框架,适用于多种应用场景,可以帮助企业实现业务流程的自动化和高效管理。