> 技术文档 > Java研学-Activiti7工作流(一)_java 工作流

Java研学-Activiti7工作流(一)_java 工作流


一 工作流介绍

1 概念

  工作流(Workflow)的核心是通过计算机技术对业务流程进行自动化管理,从而提高效率、减少人为错误,并确保任务按照预定义的规则和顺序执行。工作流系统通常用于协调多个参与者(人、系统或设备)之间的协作,确保信息、文档或任务能够在正确的时间传递给正确的人或系统。而一个软件系统中具有工作流的功能,我们把它称为工作流系统。
Java研学-Activiti7工作流(一)_java 工作流

2 工作流引擎

  工作流引擎是一种基于 BPMN(业务流程模型与标记)规范 的工作流框架,它通过预定义的规则将业务流程与具体节点分离,并以特定形式进行关联,从而实现节点的自动流转。这种框架能够将复杂的业务逻辑抽象为可视化的流程模型,并通过引擎驱动任务的执行和流转,确保流程的高效、准确运行,同时支持灵活的业务规则调整和扩展。

  1.流程部署:预定义的流程文件(BPMN)需要部署到工作流引擎中。部署后,工作流引擎会将节点和路径信息存储到数据库中,以便后续执行和管理。

  2.API 支持:工作流引擎提供了丰富的 API,用于对流程进行查询、启动、暂停、终止等操作。这些 API 屏蔽了底层实现细节,开发者无需关注复杂的流程执行逻辑,从而显著提高了开发效率。

  3.业务与流程分离:业务逻辑的处理和流程的流转是分离的,二者通过 BusinessKey 进行关联。BusinessKey 是业务数据的唯一标识,用于将业务数据与流程实例绑定,确保业务逻辑和流程流转的独立性。

3 传统工作流框架的弊端 – 工作流程变动时需修改大量代码

// 出差费用表所需字段,此时通过 status 控制流程id 申请人id 部门id 报销金额 报销类别 费用明细 电子发票单 status // 查询草稿的出差费用记录:where status=0;查询已经发起审核的记录:where status > 0;

  原始流程:申请人发起申请→部门经理审批→总经理审批→财务复批
  ① 当申请人填写申请之后,往出差表中插入一条数据,status默认值为0,status=0;当申请人发起申请之后,把状态改为1,status=1;
  ② 部门经理查看当前所在部门的员工发起的报销流程 where status=1 and 部门id=当前经理所在的部门id;对审核记录进行拒绝,状态改为2。对审核记录进行同意,状态改为3。
  ③ 总经理查看所有员工的发起报销流程 where status=3。对审核记录进行拒绝,状态改为4。对审核记录进行同意,状态改为5。
  ④ 财务查看所有员工的发起报销流程 where status=5。对审核记录进行拒绝,状态改为6。对审核记录进行同意,状态改为7。

  更改流程:申请人发起申请→部门经理审批→人事助理审批→人事经理审批→财务复批
  ① 当申请人填写申请之后,往出差表中插入一条数据,status默认值为0,status=0;当申请人发起申请之后,把状态改为1,status=1;
  ② 部门经理查看当前所在部门的员工发起的报销流程 where status=1 and 部门id=当前经理所在的部门id;对审核记录进行拒绝,状态改为2。对审核记录进行同意,状态改为3。
  ③ 弃用 总经理查看所有员工的发起报销流程 where status=3。对审核记录进行拒绝,状态改为4。对审核记录进行同意,状态改为5。
  ④ 改动 财务查看所有员工的发起报销流程 where status=11。对审核记录进行拒绝,状态改为6。对审核记录进行同意,状态改为7。
  ⑤ 改动 人事助理审批查看所有员工的发起报销流程 where status=3。对审核记录进行拒绝,状态改为8。对审核记录进行同意,状态改为9。
  ⑥ 改动 人事经理审批查看所有员工的发起报销流程 where status=9。对审核记录进行拒绝,状态改为10。对审核记录进行同意,状态改为11。

4 工作流框架如何解决流程变更问题

  ① 流程与业务是剥离的,工作流引擎只负责流程的流转。

// 业务表此时无 statusid 申请人id 部门id 报销金额 报销类别 费用明细 电子发票单10086
// 任务表 Activiti生成任务表完成任务后删除对应任务id 任务名称1 部门经理审批

  ② 将流程通过工具绘制成图像,图像本质为 xml 可通过代码读取。
  ③ 当申请人发起申请时,使用Java代码解析 xml 中第一个节点,将第一个节点直接插入到数据库表中(任务表)。
  ③ 部门经理通过审批后,解析 xml 节点,id=1,在 xml 中找到 from=1 的连线,就可以知道 to=2 (下一个节点的位置)。解析 id=2 的节点,完成任务后将任务从当前表中删除,再插入新的节点数据

// 任务表 完成任务1后删除任务1 添加任务2id 任务名称2 总经理审批

  ④ 当流程走完,无下一节点,任务表中也没有数据。
  ⑤ 更改业务流程实质上是在更改 xml 中的连线,与业务无关,Activiti7 本质上就是在解析 xml 节点。
Java研学-Activiti7工作流(一)_java 工作流
  ⑥ 流程与业务通过业务表 id 联系,启动流程时会将业务表的 id 绑定到当前流程中,整个流程在运行过程中都可以获取到这个 id 也称为 BusinessKey,通过它查找业务表中的数据,展示数据。BusinessKey 是跟随着业务流程走的,流程结束 BusinessKey 消失。

二 Activiti7 介绍

1 概述

  Activiti 7是一个开源的、轻量级的工作流和业务流程管理(BPM)平台,基于 Java 开发,支持 BPMN 2.0 标准,专为现代云原生架构设计。它提供了强大的流程引擎、丰富的 RESTful API 和事件驱动架构,能够无缝集成 Spring Boot 和微服务环境。Activiti 7 支持多租户、任务管理、流程监控和历史数据查询,适用于业务流程自动化、审批流程、任务调度等场景,帮助企业实现高效、灵活的流程管理。

2 Activiti7 内部核心机制

  1. 业务流程图的标准化
    Activiti 7 使用 BPMN 2.0 标准来定义业务流程图。
    BPMN(Business Process Model and Notation)是一种国际标准,用于描述业务流程的图形化表示。
    标准化的流程图可以确保流程的可移植性和可执行性。

  2. 业务流程图的本质
    业务流程图本质上是一个 XML 文件,符合 BPMN 2.0 规范。
    XML 文件中包含了流程的所有信息,例如节点、路径、条件、参与者等。
    XML 的结构化特性使得它能够存储复杂的数据,并易于解析和处理。

  3. 读取业务流程图的过程
    读取业务流程图的过程就是 解析 XML 文件 的过程。
    Activiti 7 的流程引擎会加载并解析 BPMN 文件,将其转换为内部可执行的对象模型。
    解析后的数据会被存储到数据库中(如 MySQL),以便后续执行和管理。

  4. 流程节点的存储
    每个业务流程图的节点(如任务、网关、事件)都会被解析为 XML 中的一个元素。
    解析后的节点数据会被插入到 MySQL 表中,形成一条记录。
    例如,ACT_RU_TASK 表存储运行中的任务,ACT_HI_TASKINST 表存储历史任务。

  5. 完整流程的存储
    一个业务流程的所有节点都会被解析并存储到 MySQL 表中。这些表包括:
    ACT_RE_PROCDEF:存储流程定义。
    ACT_RU_EXECUTION:存储流程实例的执行信息。
    ACT_RU_TASK:存储当前任务。
    ACT_HI_TASKINST:存储历史任务。

  6. 流程节点的读取
    通过读取 MySQL 表中的记录,可以获取业务流程图的节点信息。
    这种方式将流程的执行状态与数据库记录绑定,便于查询和监控。

  7. 业务流程的推进
    业务流程的推进是通过读取和处理 MySQL 表中的数据来实现的。
    当一个节点完成任务后,引擎会根据流程定义更新表中的数据,并推进到下一个节点。
    当流程结束时,相关的运行数据会被删除或归档到历史表中。

3 BPMN

  BPMN(业务流程模型和符号)由BPMI开发,后并入OMG组织。2004年推出BPMN 1.0,2011年发布BPMN 2.0。Activiti等平台基于BPMN 2.0进行流程建模与执行,提升了业务流程管理的效率和灵活性。BPMN通过XML表示业务流程的,将.bpmn文件打开:
Java研学-Activiti7工作流(一)_java 工作流

// xml 重要部分<process id=\"myProcess_1\" isClosed=\"false\" isExecutable=\"true\" processType=\"None\"> <startEvent id=\"_2\" name=\"StartEvent\"/> <endEvent id=\"_3\" name=\"EndEvent\"/> <userTask activiti:exclusive=\"true\" id=\"_4\" name=\"部门经理审批\"/> <userTask activiti:exclusive=\"true\" id=\"_5\" name=\"人事助理审批\"/> <sequenceFlow id=\"_6\" sourceRef=\"_2\" targetRef=\"_4\"/> <sequenceFlow id=\"_7\" sourceRef=\"_4\" targetRef=\"_5\"/> <userTask activiti:exclusive=\"true\" id=\"_8\" name=\"人事经理审批\"/> <sequenceFlow id=\"_9\" sourceRef=\"_5\" targetRef=\"_8\"/> <sequenceFlow id=\"_10\" sourceRef=\"_8\" targetRef=\"_3\"/> </process>

4 Activiti 使用详解

  ① 整合Activiti:Activiti是一个工作流引擎,用于对系统的业务流程进行自动化管理。为了方便业务系统访问Activiti的接口或功能,通常需要将Activiti和业务系统的环境集成在一起。

  ② 业务流程建模:使用建模工具:使用Activiti提供的流程建模工具(如Activiti Designer)来定义业务流程。这些工具通常支持图形化拖拽方式,可以方便地创建和编辑.bpmn文件。
  .bpmn文件:.bpmn文件是业务流程定义文件,通过XML定义业务流程的各个元素和它们之间的关系。这个文件是Activiti执行流程的基础。

  ③ 部署业务流程:部署流程定义:将.bpmn文件部署到Activiti中。这通常是通过Activiti提供的API来实现的。
  部署相关资源:除了.bpmn文件外,有时还需要一起部署业务流程的图片(.png)等相关资源,以便在流程执行过程中提供更直观的视图。

  ④ 启动流程实例:启动实例:启动一个流程实例表示开始一次业务流程的运行。例如,员工请假流程部署完成后,如果需要为某个员工启动请假流程,就可以创建一个新的流程实例。
  实例与定义的关系:流程实例与流程定义的关系类似于Java对象与Java类的关系。部署的流程定义相当于Java类,而启动的流程实例则相当于Java对象。

  ⑤ 查询待办任务:查询任务:通过Activiti提供的API,可以查询当前用户需要办理的任务。这些任务是根据当前流程执行的状态和用户的角色来确定的。
  任务管理:Activiti还提供了丰富的任务管理功能,如任务的分配、转交、挂起、恢复等。

  ⑥处理待办任务:办理任务:用户查询到待办任务后,就可以办理某个任务。办理任务通常包括填写相关信息、提交审批等步骤。
  任务流转:如果任务办理完成后还需要其他用户办理,Activiti会根据流程定义自动将任务流转到下一个办理人。

  ⑦ 结束流程:流程完成:当任务办理完成且没有下一个任务/结点时,这个流程实例就完成了。此时,Activiti会记录流程的执行结果和相关信息。
  历史数据:Activiti还提供了丰富的历史数据管理功能,可以查询和分析已经完成的流程实例和任务。

  ⑧ 综上所述,Activiti的使用包括整合Activiti、业务流程建模、部署业务流程、启动流程实例、查询待办任务、处理待办任务和结束流程等多个步骤。通过这些步骤,业务系统可以实现业务流程的自动化管理,提高工作效率和准确性。