跳到主要内容

Flowable 全部监听事件详解

Flowable 的事件类型分布在三个枚举中:

枚举包路径常量数用途
FlowableEngineEventTypeorg.flowable.common.engine.api.delegate.event63流程引擎运行期派发的全部事件
HistoricTaskLogEntryTypeorg.flowable.task.api.history10用户任务历史日志条目的类型
FlowableIdmEventTypeorg.flowable.idm.api.event10身份管理(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_CREATEDIDM 引擎已创建并可用
ENGINE_CLOSEDIDM 引擎已关闭
CUSTOM自定义事件占位类型

常用事件与触发时机速查​

以下事件在审批流项目中最为常用,也是 darkblue 项目实际监听的事件:

业务场景监听事件事件对象建议强转类型
流程发起PROCESS_STARTEDFlowableProcessStartedEvent
流程正常结束PROCESS_COMPLETEDFlowableEngineEntityEvent
流程撤销/删除PROCESS_CANCELLEDFlowableCancelledEvent
任务产生TASK_CREATEDFlowableEngineEntityEvent
任务完成TASK_COMPLETEDFlowableEngineEntityEvent
任务改派自定义事件 TASK_CHANGE_ASSIGNED自定义事件对象
任务驳回自定义事件 TASK_REJECT自定义事件对象

注意 PROCESS_STARTED 与 PROCESS_COMPLETED 的实体分别为执行实例(ExecutionEntity)与执行实例/历史数据,取值前应先确认事件对象携带的实体类型,再做强转。自定义事件的定义与触发方式见自定义监听事件与触发。

参考资料​