1、核心类

Flowable 引擎通过 ProcessEngine 作为总入口点,提供了多个核心服务接口,每个服务都负责特定的功能领域:

服务名称 (Service Name)主要功能 (Main Functionality)关键操作 (Key Operations)
RepositoryService管理流程定义和部署(存储和检索流程定义资源)部署流程定义、查询流程定义、暂停/激活流程定义
RuntimeService管理流程实例和执行(启动流程实例、管理流程变量、触发继续操作)启动流程实例、设置/获取流程变量、查询流程实例和执行
TaskService管理用户任务(查询、认领、完成、删除任务)查询任务、认领任务、完成任务、设置任务变量
HistoryService访问历史数据(查询已完成的流程实例、任务、活动实例等)查询历史流程实例、历史任务、历史活动细节
IdentityService管理用户和组(创建、查询、删除用户和组信息)创建用户/组、查询用户/组、建立用户与组的关系
ManagementService提供引擎管理和维护功能(查询数据库表、管理作业)查询数据库表信息、管理作业(如定时器)
FormService管理表单数据(可选服务,处理开始表单和任务表单数据)获取开始表单数据、提交任务表单数据
DynamicBpmnService动态修改流程定义(无需重新部署即可更新流程元素属性)修改用户任务办理人、修改服务任务类名、更新顺序流条件

2、常用Api

1、流程定义

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").latestVersion().singleResult();

2、流程实例

ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());

3、部署单元

Deployment deployment = repositoryService.createDeployment().addClasspathResource("process/performance.bpmn20.xml").name("绩效流程").category("HR").deploy();

4、启动流程实例

Map<String, Object> variables = new HashMap<>();
variables.put("employee", "张三");
variables.put("nrOfHolidays", 5);
variables.put("description", "年假申请");ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);processInstance.getId();

5、查询用户任务

// 查询任务
taskService.createTaskQuery().taskAssignee(assignee).orderByTaskCreateTime().desc().list();// 完成任务        
taskService.complete(taskId);

6、历史数据查询

List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().finished().orderByProcessInstanceEndTime().desc().list();

7、JavaDelegate 实现服务任务

/*** 请假审批服务任务*/
public class LeaveApprovalServiceTask implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) {// 从流程变量中获取数据String employee = (String) execution.getVariable("employee");Integer nrOfHolidays = (Integer) execution.getVariable("nrOfHolidays");String description = (String) execution.getVariable("description");// 执行业务逻辑,例如发送邮件、调用外部系统等boolean approved = approveLeaveRequest(employee, nrOfHolidays, description);// 设置审批结果流程变量execution.setVariable("approved", approved);System.out.println("请假申请审批完成: " + approved);}private boolean approveLeaveRequest(String employee, int nrOfHolidays, String reason) {// 这里实现具体的审批逻辑// 示例简单规则:请假天数小于7天自动批准return nrOfHolidays <= 7;}
}

8、TaskListener

事件类型 (Event Type)触发时机说明典型应用场景
create当任务已经创建,并且所有任务参数都已经设置完成后触发。动态设置任务的办理人、候选人或候选组。
assignment当任务已经指派给某个办理人后触发。注意:此事件在 create 事件之前被触发。记录任务分配信息,或向被指派者发送通知。
complete当任务已经完成(审批通过或拒绝),但尚未从运行时数据中删除时触发。根据任务结果更新业务状态,执行后续业务操作。
delete在任务被删除之前触发。清理与任务相关的资源或状态。

xml配置

<userTask id="user_approval_task" name="用户审批任务" flowable:formKey="approval_form"><extensionElements><!-- 使用 delegateExpression 来引用Spring容器中的Bean --><flowable:taskListener event="create" delegateExpression="${dynamicAssigneeListener}"/></extensionElements>
</userTask

/*** 动态设置任务办理人的监听器示例* 使用 @Component 注解,并指定 Bean 名称(与流程定义中的 delegateExpression 对应)*/
@Component("dynamicAssigneeListener") // 这个值需要与流程XML中的delegateExpression一致
public class DynamicAssigneeListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {// 1. 获取当前任务的事件类型String eventName = delegateTask.getEventName();System.out.println("任务监听器被触发,事件类型: " + eventName);// 2. 通常我们只在 create 事件中设置办理人if (TaskListener.EVENTNAME_CREATE.equals(eventName)) {// 3. 这里是你的业务逻辑:根据流程变量、组织架构等动态决定办理人// 例如,从流程变量中获取预先设置的办理人String assignee = (String) delegateTask.getVariable("assignee"); // 来自流程变量的办理人// 4. 如果变量中存在办理人,则设置;否则可以设置一个默认值或根据其他逻辑获取if (assignee != null && !assignee.isEmpty()) {delegateTask.setAssignee(assignee);} else {// 示例:默认指派给特定用户(实际项目中请替换为你的逻辑)String defaultAssignee = "*****"; // 默认办理人delegateTask.setAssignee(defaultAssignee);}}}
}

9、网关

  • 排他网关ExclusiveGateway

有多个条件入口,最终只能有一个条件出口,每个条件之间是竞争关系,只要有一个条件成立就会流转到下一个节点。

  • 并行网关ParallelGateway

必须网关中的每个任务都完成,才会进入下一个节点。

  • 包容网关InclusiveGateway

排他网关和并行网关的结合体

  • 事件网关 EventGateway

根据事件(如消息事件、信号事件等)来决定流程的走向。它不会计算条件,而是等待事件的发生。每个出口都是中间捕获事件

3、核心表

通用数据表(2个)
历史表(8个,HistoryService接口操作的表)
用户相关表(4个,IdentityService接口操作的表)
流程定义、流程模板相关表(3个,RepositoryService接口操作的表)
流程运行时表(6个,RuntimeService接口操作的表)

1、Flowable的所有数据库表都以ACT_开头
2、ACT_RE_: 'RE’代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。
3、ACT_RU_: 'RU’代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。
4、ACT_HI_: 'HI’代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。
5、ACT_GE_: 通用数据。在多处使用。act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图的字节流文件;
act_ge_property:属性数据表# HistoryService
act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);
act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);
act_hi_comment:历史意见表;
act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);
act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;
act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);
act_hi_taskinst:历史流程任务表,存储历史任务节点;
act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;# IdentityService
act_id_group:用户组信息表,对应节点选定候选组信息;
act_id_info:用户扩展信息表,存储用户扩展信息;
act_id_membership:用户与用户组关系表;
act_id_user:用户信息表,对应节点选定办理人或候选人信息;# RepositoryService
act_re_deployment:部属信息表,存储流程定义、模板部署信息;
act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;# RuntimeService
act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;
act_ru_event_subscr:监听信息表,不常用;
act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);
act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用;
act_ru_job:运行时定时任务数据表,存储流程的定时任务信息;
act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息;

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(RDFS)随机深度特征选择方法解释:简而言之,RDFS主要针对的是恶意的服务器,它建立在客户端是诚实的前提下。

1. 随机深度特征选择是怎么实现的&#xff1f;随机深度特征选择 是一种在分布式机器学习&#xff08;特别是联邦学习&#xff09;中用于保护客户端数据隐私的技术。它的核心思想是&#xff1a;在每一轮训练中&#xff0c;每个客户端随机选择模型的一个子集&#xff08;即“深度…

C++20格式化字符串:std::format的使用与实践

在C编程中&#xff0c;字符串格式化是一项常见的任务。在C20引入std::format之前&#xff0c;开发者通常依赖于一些传统的解决方案&#xff0c;如printf系列函数、sstream&#xff0c;或者第三方库如boost.format。然而&#xff0c;这些方法在代码可读性、类型安全性和灵活性方…

【漏洞复现】CVE-2025-8088|WinRAR 路径穿越漏洞:从原理到蓝屏攻击全流程

【漏洞复现】CVE-2025-8088&#xff5c;WinRAR 路径穿越漏洞&#xff1a;从原理到蓝屏攻击全流程 前言 WinRAR 作为 Windows 平台最常用的压缩管理工具之一&#xff0c;几乎是每台电脑的 “标配软件”。但在 2025 年 8 月&#xff0c;一款影响范围覆盖 WinRAR 0 至 7.12 全版本…

uniapp中使用echarts并且支持pc端的拖动、拖拽和其他交互事件

npm install echarts -D ​ // "echarts": "^5.3.2", [推荐版本] // "zrender": "^5.3.2" [如果报错的话就安装这个]<template><view class"container"><view id"myChart" class"chart"…

Qt中QProxyStyledrawControl函数4个参数的意义

Qt中QProxyStyle::drawControl函数4个参数的意义 我们来详细解释一下 Qt 中 QProxyStyle::drawControl 函数的四个参数。 这个函数是 Qt 样式系统中的一个核心方法&#xff0c;用于绘制标准 UI 元素&#xff08;如按钮、复选框、菜单栏等&#xff09;。当你继承 QProxyStyle 并…

idf-esp32 PWM呼吸灯(LEDC头文件)

相关宏和变量#define LED_PIN GPIO_NUM_3 #define LEDC_CHANNEL LEDC_CHANNEL_0 #define LEDC_TIMER LEDC_TIMER_0 #define LEDC_MODE LEDC_LOW_SPEED_MODE #define LEDC_DUTY_RES LEDC_TIMER_13_BIT // 2^13 8192级亮度 #define LEDC_FREQUENCY 50…

PLC_博图系列☞基本指令”S_ODTS:分配保持型接通延时定时器参数并启动“

PLC_博图系列☞基本指令”S_ODTS&#xff1a;分配保持型接通延时定时器参数并启动“ 文章目录PLC_博图系列☞基本指令”S_ODTS&#xff1a;分配保持型接通延时定时器参数并启动“背景介绍S_ODTS&#xff1a; 分配保持型接通延时定时器参数并启动说明参数脉冲时序图示例关键字&a…

OneCode 可视化揭秘系列(三):AI MCP驱动的智能工作流逻辑编排

OneCode 可视化揭秘系列&#xff08;三&#xff09;&#xff1a;AI MCP驱动的智能工作流逻辑编排 引言 在前两篇系列博文中&#xff0c;我们详细探讨了OneCode可视化动作的基础配置与界面设计&#xff0c;以及组件交互与数据流管理。在本篇文章中&#xff0c;我们将深入剖析逻辑…

TypeORM、Sequelize、Hibernate 的优缺点对比:新手常见 SQL 与 ORM 踩坑总结

1. ORM 与关系型数据库&#xff08;MySQL、PostgreSQL&#xff09; 的使用 SQL 语句编写&#xff08;JOIN、GROUP BY、索引使用、事务控制&#xff09;与 ORM 映射&#xff08;如 Sequelize、TypeORM、Hibernate&#xff09;之间的差异会让新手非常纠结&#xff1b;尤其是理解…

JavaScript 创建型设计模式详解

1. 单例模式1.1. 使用场景在前端开发中&#xff0c;全局状态管理、配置信息、数据库连接等往往需要在应用中只存在一个实例&#xff0c;避免多次实例化带来的数据不一致性。例如&#xff0c;在一个前端应用中&#xff0c;全局的 loading 状态通常需要一个单例模式来确保其唯一性…

k8s除了主server服务器可正常使用kubectl命令,其他节点不能使用原因,以及如何在其他k8s节点正常使用kubectl命令??

kubectl 并不是“只能”在主节点&#xff08;Control Plane Node&#xff09;使用&#xff0c;而是因为它需要访问 Kubernetes 的 kube-apiserver&#xff0c;而 kube-apiserver 通常只在主节点上运行并监听内部网络。简单来说kubectl 需要连接 kube-apiserver&#xff01;&…

Custom SRP - Complex Maps

https://catlikecoding.com/unity/tutorials/custom-srp/complex-maps/1 创建材质球我们的材质已经支持光照,并且支持 Albedo 和 Emission 贴图.创建材质球,并应用下面的电路板的图分别作为 albedo emission设置材质球的金属度为 1 , 光滑度为 0.952 Mask Map在 albedo 图上的不…

repo 学习教程

你现在会用 git 了&#xff0c;接下来学 repo&#xff08;Google 推出来的多仓库管理工具&#xff09;&#xff0c;其实就是在 Git 的基础上做了一层封装&#xff0c;方便同时管理很多 Git 仓库。像 Android 源码、Rockchip 全套 SDK 都是靠 repo 来拉取和管理的。 我给你分几个…

[SWERC 2020] Safe Distance题解

[SWERC 2020] Safe Distance 题意 给定 NNN 个点与一个坐标 (X,Y)(X,Y)(X,Y)&#xff0c;求从点 (0,0)(0,0)(0,0) 到点 (X,Y)(X,Y)(X,Y) 规划一条路线&#xff0c;不能走出 (0,0)(0,0)(0,0) 与 (X,Y)(X,Y)(X,Y) 间形成的矩形&#xff0c;使得通过这条路线时距离最近的点的距离…

Rewind-你人生的搜索引擎

本文转载自&#xff1a;Rewind-你人生的搜索引擎 - Hello123工具导航 ** 一、&#x1f50d; Rewind 是什么&#xff1f;你的数字记忆增强神器 Rewind 是一款人工智能驱动的个人记忆助手&#xff0c;就像为你配备了一个「数字第二大脑」。它能自动记录、保存并索引你在电脑和手…

开发小点 - 存

开发小点 1.Req注解 EqualsAndHashCode(callSuper true) Data public class BillSituationReq extends BillQueryReq {/*** Whether to display the ring ratio, default is not displayed*/ApiModelProperty("Whether to Display YoY Comparison")private Boolean …

只会npm install?这5个隐藏技巧让你效率翻倍!

原文链接&#xff1a;https://mp.weixin.qq.com/s/nijxVWj-E5U08DX2fl3vgg最近有个刚学前端的小伙伴问我&#xff1a;“为什么我的node_modules这么大&#xff1f;为什么别人装依赖那么快&#xff1f;npx到底是啥玩意儿&#xff1f;” 相信不少人都跟他一样&#xff0c;对npm的…

(二).net面试(static)

文章目录项目地址一、基础501.1 new keyword1.2 static class vs. static method1. static class2. static method3. static constructor 静态构造函数4. 静态成员的生命周期1.3 LinQ1.what is LinQ2. List<T>、IEnumerable<T>、IQueryable<T>3. 在数据库里用…

docker,本地目录挂载

理解Docker本地目录挂载的基本概念Docker本地目录挂载允许容器与宿主机共享文件或目录&#xff0c;实现数据持久化和实时交互。挂载方式分为bind mount和volume两种&#xff0c;前者直接映射宿主机路径&#xff0c;后者由Docker管理存储路径。本地目录挂载的核心方法bind mount…

IO多路复用相关知识

select、poll、epoll 在传入的性能差异是不是体现在&#xff0c;当有新的连接过来&#xff0c;此时需要将新的fd传入到内核中&#xff0c;但是poll/select需要出入整个数组&#xff0c;而epoll方式只需要出入单个fd&#xff1f; 1. select/poll 的情况它们没有内核中“长期保存…