工作流之Flowable

news2024/11/6 8:21:08

一、定义

工作流(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.ymlapplication.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提供了丰富的服务,如RuntimeServiceTaskServiceHistoryService等,用于查询和管理流程实例、任务、历史数据等。
  • 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是一个功能强大、易于使用、灵活可扩展的业务流程管理框架,适用于多种应用场景,可以帮助企业实现业务流程的自动化和高效管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter结合ansible分布式压测--1数据准备

一、搭建ansible环境 ansible是基于python开发&#xff0c;通过ssh连接客户机执行任务。ansible可以批量系统配置、批量程序部署、批量运行命令等。 1、安装yum install ansible 2、检查ansible的版本:ansible --version 二、利用ansible在其他机器上准备压测数据 1、本地准…

蓬勃发展:移动开发——关于软件开发你需要知道些什么

一、前言 移动开发一直都是软件开发领域中最有趣的领域之一&#xff0c;这是因为&#xff1a; 1、移动开发为“只有一个人”的开发团队提供了一个非常独特的机会&#xff0c;让他可以在相对较短的时间内建立一个实际的、可用的、有意义的应用程序&#xff1b; 2、移动开发也代…

gitmakegdb

git git reset 命令 | 菜鸟教程 (runoob.com) 像嫁接一样 make Makefile | 爱编程的大丙 (subingwen.cn) # 举例: 有源文件 a.c b.c c.c head.h, 需要生成可执行程序 app ################# 例1 ################# app:a.c b.c c.cgcc a.c b.c c.c -o app################# 例…

网络安全认证的证书有哪些?

在网络安全领域&#xff0c;专业认证不仅是个人技术能力的象征&#xff0c;也是职业发展的重要推动力。随着网络安全威胁的日益严峻&#xff0c;对网络安全专业人才的需求也在不断增长。本文将介绍一些网络安全认证的证书&#xff0c;帮助有志于从事网络安全行业的人士了解并选…

初阶数据结构的各种排序方法——冒泡,直接插入,希尔,快排,选择,归并(C语言)

1.交换排序 交换排序基本思想&#xff1a; 所谓交换&#xff0c;就是根据序列中两个记录键值的⽐较结果来对换这两个记录在序列中的位置 交换排序的特点是&#xff1a;将键值较⼤的记录向序列的尾部移动&#xff0c;键值较⼩的记录向序列的前部移动。 1.1冒泡排序 例子&…

qt QFileInfo详解

1、概述 QFileInfo是Qt框架中用于获取文件信息的工具类。它提供了与操作系统无关的文件属性&#xff0c;如文件的名称、位置&#xff08;路径&#xff09;、访问权限、类型&#xff08;是否为目录或符号链接&#xff09;等。此外&#xff0c;QFileInfo还可以获取文件的大小、创…

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档&#xff0c;Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置&#xff08;路径Proxy->Proxy Settings&#xff09; 3.1.1.不抓包Windows&#xff0c;即不勾选此项&#xff0c;免得打输出不…

软件压力测试有多重要?北京软件测试公司有哪些?

软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。压力测试是给软件不断加压&#xff0c;强制其在极限的情况下运行&#xff0c;观察它可以运行到何种程度&#xff0c;从而发现性能缺陷。 在数字化时代&#xff0c;用户对软件性能的要求越…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分&#xff0c;图形显示有所变化&#xff0c;美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

进程的调度(超详细解读)

在特别老的操作系统中&#xff0c;进程的调度是根据FIFO调度算法进行调度&#xff0c;先进先出式的调度&#xff0c;其实就是队列&#xff0c;但是不能很好的体现进程的优先级&#xff0c;在上节讲解的进程优先级&#xff0c;知道nice值范围是[-20&#xff0c;19]&#xff0c;然…

【初阶数据结构篇】链式结构二叉树(续)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

【拥抱AI】如何让软件开发在保证数据安全的同时更加智能与高效?

第一、推动软件开发向更加智能化、高效化和创新化方向发展的策略 随着AI技术的不断进步&#xff0c;软件开发正朝着更加智能化、高效化和创新化的方向发展。要实现这一目标&#xff0c;企业需要采取一系列综合性的策略&#xff0c;从技术、管理、文化等多个层面入手。以下是一…

elementUI 点击弹出时间 date-picker

elementUI的日期组件&#xff0c;有完整的UI样式及弹窗&#xff0c;但是我的页面不要它的UI样式&#xff0c;点击的时候却要弹出类似的日期选择器&#xff0c;那怎么办呢&#xff1f; 以下是elementUI自带的UI风格&#xff0c;一定要一个输入框来触发。 这是我的项目中要用到的…

柯桥topik考级韩语培训【韩语干货】表存在的에和에게有什么区别?

相同点 都可以接在体词后&#xff0c;表示存在的地点、场所&#xff0c;以及所有者。 例如&#xff1a; 1&#xff09;여동생이 집에 있어요. 妹妹在家。 2&#xff09; 식당이 도서관 뒤에 있다. 食堂在图书馆后面。 3&#xff09; 언니에게 고급 화장품이 있다. 姐姐有高级…

使用 ABAP GIT 发生 IF_APACK_MANIFEST dump

错误重现 使用经典的 ABAP 系统运行 ZABAPGIT 或者 ZABAPGIT_STANDALONE然后添加在线或者离线项目点击 PullShort dump SYNTAX_ERROR Dump 界面&#xff1a; 解决方案 它发生在 CREATE OBJECT lo_manifest_provider TYPE (ls_manifest_implementation-clsname) 语句中。 该语…

多商户电商平台开发指南:基于直播带货系统源码的搭建方案详解

本篇文章&#xff0c;小编将详细解析如何利用直播带货系统源码&#xff0c;快速搭建一套多商户电商平台的解决方案。 一、直播带货系统在多商户电商平台中的应用价值 在多商户电商平台中&#xff0c;直播带货系统可以帮助商家&#xff1a; 1.增加用户互动 2.提升转化率 3.…

【TextIn:开源免费的AI智能文字识别产品(通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等)】

TextIn&#xff1a;开源免费的AI智能文字识别产品&#xff08;通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等&#xff09; 产品的官网&#xff1a;TextIn官网 希望感兴趣以及有需求的小伙伴们多多了解&#xff0c;因为这篇文章也是源于管网介绍才产出的…

(C++回溯算法)微信小程序“开局托儿所”游戏

问题描述 给定一个矩阵 A ( a i j ) m n \bm A(a_{ij})_{m\times n} A(aij​)mn​&#xff0c;其中 a i j ∈ { 1 , 2 , ⋯ , 9 } a_{ij}\in\{1,2,\cdots,9\} aij​∈{1,2,⋯,9}&#xff0c;且满足 ∑ i 1 m ∑ j 1 n a i j \sum\limits_{i1}^m\sum\limits_{j1}^na_{ij} i…

Java学习Day57:碧水金睛兽!(Spring Cloud微服务1.0)

1.微服务入门 (1).单体架构与分布式架构 单体架构&#xff1a; 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署优点&#xff1a; 架构简单、部署成本低 &#xff1b; 缺点&#xff1a; 耦合度高项目打包部署到Tomcat&#xff0c;用户直接访问。用户量增加后…

Golang | Leetcode Golang题解之第541题反转字符串II

题目&#xff1a; 题解&#xff1a; func reverseStr(s string, k int) string {t : []byte(s)for i : 0; i < len(s); i 2 * k {sub : t[i:min(ik, len(s))]for j, n : 0, len(sub); j < n/2; j {sub[j], sub[n-1-j] sub[n-1-j], sub[j]}}return string(t) }func min…