Flowable 全部监听事件详解
Flowable 的事件类型分布在三个枚举中:
| 枚举 | 包路径 | 常量数 | 用途 |
|---|---|---|---|
FlowableEngineEventType | org.flowable.common.engine.api.delegate.event | 63 | 流程引擎运行期派发的全部事件 |
HistoricTaskLogEntryType | org.flowable.task.api.history | 10 | 用户任务历史日志条目的类型 |
FlowableIdmEventType | org.flowable.idm.api.event | 10 | 身份管理(IDM)引擎事件 |
三个枚举都实现了 FlowableEventType 接口,因此都可以作为监听器 getTypes() 的返回值参与事件匹配。
事件模型
事件对象是 FlowableEvent 的实例,getType() 返回其类型。引擎事件在此基础上扩展出若干子接口,监听器根据需要的粒度选择强转类型:
FlowableEvent:最顶层接口,只有事件类型;FlowableEngineEvent:携带执行实例、流程实例、流程定义以及 scope 相关标识,是绝大多数业务监听器使用的基接口;FlowableEntityEvent:携带关联实体对象(如任务、执行实例、变量),getEntity()返回实体,hasEntity()判断是否存在;FlowableCancelledEvent:流程/活动被取消时使用,可获取取消原因与被取消元素;FlowableEntityExceptionEvent:作业执行失败等异常场景使用,getException()返回异常对象。
事件由引擎在对应时机创建并派发。监听器通过 getTypes() 声明关注的事件类型,分发器只把匹配的事件交给监听器(注册与过滤机制见监听配置与示例)。
FlowableEngineEventType 全部事件
按业务类别整理如下(说明来自 Flowable 7.1.0 javadoc)。
流程实例事件
| 事件 | 说明 |
|---|---|
PROCESS_CREATED | 流程实例已创建:基本属性已设置,但流程变量尚未设置 |
PROCESS_STARTED | 流程实例已启动:在创建后启动时派发,晚于 ENTITY_INITIALIZED 且变量已设置 |
PROCESS_COMPLETED | 流程已完成:最后一个活动派发 ACTIVITY_COMPLETED 之后触发 |
PROCESS_COMPLETED_WITH_TERMINATE_END_EVENT | 流程以终止结束事件完成 |
PROCESS_COMPLETED_WITH_ERROR_END_EVENT | 流程以错误结束事件完成 |
PROCESS_COMPLETED_WITH_ESCALATION_END_EVENT | 流程以升级结束事件完成 |
PROCESS_CANCELLED | 流程实例被删除(deleteProcessInstance),在数据库删除前派发 |
活动事件
| 事件 | 说明 |
|---|---|
ACTIVITY_STARTED | 活动开始执行前派发 |
ACTIVITY_COMPLETED | 活动成功完成 |
ACTIVITY_CANCELLED | 活动因边界事件被取消 |
ACTIVITY_COMPENSATE | 活动将作为另一个活动的补偿执行 |
ACTIVITY_SIGNAL_WAITING | 边界、中间或子流程起始的信号捕获事件开始等待 |
ACTIVITY_SIGNALED | 活动收到信号(响应信号后派发) |
ACTIVITY_CONDITIONAL_WAITING | 条件捕获事件开始等待 |
ACTIVITY_CONDITIONAL_RECEIVED | 活动收到条件事件,其后通常会跟随 ACTIVITY_SIGNALED 或 ACTIVITY_COMPLETED |
ACTIVITY_ESCALATION_WAITING | 升级捕获事件开始等待 |
ACTIVITY_ESCALATION_RECEIVED | 活动收到升级事件 |
ACTIVITY_MESSAGE_WAITING | 消息捕获事件开始等待 |
ACTIVITY_MESSAGE_RECEIVED | 活动收到消息事件 |
ACTIVITY_MESSAGE_CANCELLED | 消息捕获事件被取消 |
ACTIVITY_ERROR_RECEIVED | 活动收到错误事件 |
多实例与顺序流事件
| 事件 | 说明 |
|---|---|
MULTI_INSTANCE_ACTIVITY_STARTED | 多实例活动开始执行前派发 |
MULTI_INSTANCE_ACTIVITY_COMPLETED | 多实例活动成功完成 |
MULTI_INSTANCE_ACTIVITY_COMPLETED_WITH_CONDITION | 多实例活动满足完成条件而结束 |
MULTI_INSTANCE_ACTIVITY_CANCELLED | 多实例 活动被取消 |
SEQUENCEFLOW_TAKEN | 引擎沿一条顺序流从源活动跳转到目标活动 |
任务事件
| 事件 | 说明 |
|---|---|
TASK_CREATED | 任务已创建且完全初始化(早于任务监听器 create 事件) |
TASK_ASSIGNED | 任务被指派给办理人(与 ENTITY_UPDATED 同时派发) |
TASK_COMPLETED | 任务已完成(任务实体删除前派发,其后该任务对应的活动会派发 ACTIVITY_COMPLETED) |
TASK_OWNER_CHANGED | 任务所有者变更 |
TASK_PRIORITY_CHANGED | 任务优先级变更 |
TASK_DUEDATE_CHANGED | 任务截止时间变更 |
TASK_NAME_CHANGED | 任务名称变更 |
实体生命周期事件
实体事件适用于任务、执行实例、流程定义、部署、模型等各类实体对象,监听时通常强转为 FlowableEngineEntityEvent 并从 getEntity() 获取实体。
| 事件 | 说明 |
|---|---|
ENTITY_CREATED | 新实体已创建 |
ENTITY_INITIALIZED | 新实体已创建且所有属性已设置 |
ENTITY_UPDATED | 已有实体被更新 |
ENTITY_DELETED | 已有实体被删除 |
ENTITY_SUSPENDED | 已有实体被挂起 |
ENTITY_ACTIVATED | 已有实体被激活 |
作业与定时器事件
| 事件 | 说明 |
|---|---|
TIMER_SCHEDULED | 定时器已被调度 |
TIMER_FIRED | 定时器成功触发 |
JOB_CANCELED | 定时器被取消(如其绑定的用户任务提前完成) |
JOB_EXECUTION_SUCCESS | 作业执行成功 |
JOB_EXECUTION_FAILURE | 作业执行失败(事件通常为异常事件,可获取异常) |
JOB_RETRIES_DECREMENTED | 作业重试次数被递减 |
JOB_REJECTED | 作业被异步执行器拒绝(通常表示队列已满) |
JOB_RESCHEDULED | 作业被重新调度 |
JOB_MOVED_TO_DEADLETTER | 作业移入死信队列(通常表示重试次数已耗尽) |
变量事件
| 事件 | 说明 |
|---|---|
VARIABLE_CREATED | 新变量已创建 |
VARIABLE_UPDATED | 已有变量被更新 |
VARIABLE_DELETED | 已有变量被删除 |
历史事件
历史事件要求启用对应历史级别(最低 ACTIVITY)才会派发。
| 事件 | 说明 |
|---|---|
HISTORIC_ACTIVITY_INSTANCE_CREATED | 历史活动实例已创建,实体为 HistoricActivityInstance |
HISTORIC_ACTIVITY_INSTANCE_ENDED | 历史活动实例标记为结束 |
HISTORIC_PROCESS_INSTANCE_CREATED | 历史流程实例已创建,实体为 HistoricProcessInstance |
HISTORIC_PROCESS_INSTANCE_ENDED | 历史流程实例标记为结束 |
CMMN 事件
| 事件 | 说明 |
|---|---|
CASE_STARTED | 案例实例已启动(晚于 ENTITY_INITIALIZED 且变量已设置) |
CASE_ENDED | 案例实例通过完成或终止而结束 |
STAGE_STARTED | 阶段实例进入活动状态(区别于阶段计划项的创建) |
STAGE_ENDED | 阶段实例结束(完成、手动终止或退出) |
引擎生命周期与其它事件
| 事件 | 说明 |
|---|---|
ENGINE_CREATED | 引擎已创建并可用 |
ENGINE_CLOSED | 引擎已关闭,不可再使用 |
CHANGE_TENANT_ID | 执行了租户变更 |
CUSTOM | 自定义事件占位类型,引擎自身不会派发,仅供外部 API 调用派发使用 |
HistoricTaskLogEntryType:任务历史日志条目
HistoricTaskLogEntryType 用于标识用户任务历史日志(ACT_HI_TASK_LOG)中的条目类型。它实现 FlowableEventType,但用途是给历史任务日志分类,配合 HistoryService#createHistoricTaskLogEntryQuery() 按类型查询任务变更历史,而不是作为引擎事件派发。
| 日志类型 | 说明 |
|---|---|
USER_TASK_CREATED | 用户任务创建 |
USER_TASK_COMPLETED | 用户任务完成 |
USER_TASK_ASSIGNEE_CHANGED | 任务办理人变更 |
USER_TASK_OWNER_CHANGED | 任务所有者变更 |
USER_TASK_PRIORITY_CHANGED | 任务优先级变更 |
USER_TASK_DUEDATE_CHANGED | 任务截止时间变更 |
USER_TASK_NAME_CHANGED | 任务名称变更 |
USER_TASK_SUSPENSIONSTATE_CHANGED | 任务挂起状态变更 |
USER_TASK_IDENTITY_LINK_ADDED | 任务身份关联(候选人/候选组)添加 |
USER_TASK_IDENTITY_LINK_REMOVED | 任务身份关联移除 |
查询示例:
List<HistoricTaskLogEntry> entries = historyService.createHistoricTaskLogEntryQuery()
.type(HistoricTaskLogEntryType.USER_TASK_COMPLETED.name())
.processInstanceId(processInstanceId)
.orderByTimestamp()
.asc()
.list();
FlowableIdmEventType:IDM 事件
IDM(身份管理)引擎在管理用户、组、成员关系时派发这些事件,监听器通过 IdmEventDispatcher / IDM 引擎的事件分发接口注册。
| 事件 | 说明 |
|---|---|
ENTITY_CREATED | 身份实体(用户/组)已创建 |
ENTITY_INITIALIZED | 身份实体已创建且其派生实体也已创建并初始化 |
ENTITY_UPDATED | 身份实体被更新 |
ENTITY_DELETED | 身份实体被删除 |
MEMBERSHIP_CREATED | 成员关系已创建 |
MEMBERSHIP_DELETED | 单个成员关系被删除 |
MEMBERSHIPS_DELETED | 组内全部成员关系被删除(删除前派发,监听器中仍可访问成员关系) |
ENGINE_CREATED | IDM 引擎已创建并可用 |
ENGINE_CLOSED | IDM 引擎已关闭 |
CUSTOM | 自定义事件占位类型 |
常用事件与触发时机速查
以下事件在审批流项目中最为常用,也是 darkblue 项目实际监听的事件:
| 业务场景 | 监听事件 | 事件对象建议强转类型 |
|---|---|---|
| 流程发起 | PROCESS_STARTED | FlowableProcessStartedEvent |
| 流程正常结束 | PROCESS_COMPLETED | FlowableEngineEntityEvent |
| 流程撤销/删除 | PROCESS_CANCELLED | FlowableCancelledEvent |
| 任务产生 | TASK_CREATED | FlowableEngineEntityEvent |
| 任务完成 | TASK_COMPLETED | FlowableEngineEntityEvent |
| 任务改派 | 自定义事件 TASK_CHANGE_ASSIGNED | 自定义事件对象 |
| 任务驳回 | 自定义事件 TASK_REJECT | 自定义事件对象 |
注意 PROCESS_STARTED 与 PROCESS_COMPLETED 的实体分别为执行实例(ExecutionEntity)与执行实例/历史数据,取值前应先确认事件对象携带的实体类型,再做强转。自定义事件的定义与触发方式见自定义监听事件与触发。