Flowable-事件处理

事件处理器主要用于工作流引擎处理相应的操作时,通知到程序,程序中可以根据业务需求编写处理逻辑

实现事件监听器需要实现org.flowable.common.engine.api.delegate.event.FlowableEventListener接口

可以被监听的对象

entityType可用的值有:attachment(附件), comment(备注), execution(执行), identity-link(身份关联), job(作业), process-instance(流程实例), process-definition(流程定义), task(任务)。

支持的事件类型

每种类型对应org.flowable.engine.common.api.delegate.event.FlowableEventType中的一个枚举值

事件名称 说明
ENGINE_CREATED 本监听器所属的流程引擎已经创建,并可以响应API调用。
ENGINE_CLOSED 本监听器所属的流程引擎已经关闭,不能再对该引擎进行API调用。
ENTITY_CREATED 新的实体已经创建。该实体包含在本事件里。
ENTITY_INITIALIZED 新的实体已经创建并完全初始化。如果任何子实体作为该实体的一部分被创建,本事件会在子实体创建/初始化后触发,与 ENTITY_CREATE 事件相反。
ENTITY_UPDATED 实体已经更新。该实体包含在本事件里。
ENTITY_DELETED 实体已经删除。该实体包含在本事件里。
ENTITY_SUSPENDED 实体已经暂停。该实体包含在本事件里。ProcessDefinitions(流程定义), ProcessInstances(流程实例)与Tasks(任务)会分发本事件。
ENTITY_ACTIVATED 实体已经激活。该实体包含在本事件里。ProcessDefinitions, ProcessInstances与Tasks会分发本事件。
JOB_EXECUTION_SUCCESS 作业已经成功执行。该作业包含在本事件里。
JOB_EXECUTION_FAILURE 作业执行失败。该作业与异常包含在本事件里。
JOB_RETRIES_DECREMENTED 作业重试次数已经由于执行失败而减少。该作业包含在本事件里。
TIMER_SCHEDULED 已创建一个定时作业,并预计在未来时间点执行。
TIMER_FIRED 定时器已经触发。
JOB_CANCELED 作业已经取消。该作业包含在本事件里。作业会由于API调用取消,任务完成导致关联的边界定时器取消,也会由于新流程定义的部署而取消。
ACTIVITY_STARTED 节点开始执行
ACTIVITY_COMPLETED 节点成功完成
ACTIVITY_CANCELLED 节点将要取消。节点的取消有三个原因(MessageEventSubscriptionEntity, SignalEventSubscriptionEntity, TimerEntity)。
ACTIVITY_SIGNALED 节点收到了一个信号
ACTIVITY_MESSAGE_RECEIVED 节点收到了一个消息。事件在节点接收消息前分发。节点接收消息后,会为该节点分发 ACTIVITY_SIGNAL 或 ACTIVITY_STARTED 事件,取决于其类型(边界事件,或子流程启动事件)。
ACTIVITY_MESSAGE_WAITING 一个节点已经创建了一个消息事件订阅,并正在等待接收消息。
ACTIVITY_MESSAGE_CANCELLED 一个节点已经取消了一个消息事件订阅,因此接收这个消息不会再触发该节点。
ACTIVITY_ERROR_RECEIVED 节点收到了错误事件。在节点实际处理错误前分发。该事件的activityId为处理错误的节点。如果错误成功传递,后续会为节点发送 ACTIVITY_SIGNALLED 或 ACTIVITY_COMPLETE 消息。
UNCAUGHT_BPMN_ERROR 抛出了未捕获的BPMN错误。流程没有该错误的处理器。该事件的activityId为空。
ACTIVITY_COMPENSATE 节点将要被补偿(compensate)。该事件包含将要执行补偿的节点id。
MULTI_INSTANCE_ACTIVITY_STARTED 多实例节点开始执行
MULTI_INSTANCE_ACTIVITY_COMPLETED 多实例节点成功完成
MULTI_INSTANCE_ACTIVITY_CANCELLED 多实例节点将要取消。多实例节点的取消有三个原因(MessageEventSubscriptionEntity, SignalEventSubscriptionEntity, TimerEntity)。
VARIABLE_CREATED 流程变量已经创建。本事件包含变量名、取值,及关联的执行和任务(若有)。
VARIABLE_UPDATED 变量已经更新。本事件包含变量名、取值,及关联的执行和任务(若有)。
VARIABLE_DELETED 变量已经删除。本事件包含变量名、最后取值,及关联的执行和任务(若有)。
TASK_ASSIGNED 任务已经分派给了用户。该任务包含在本事件里。
TASK_CREATED 任务已经创建。本事件在 ENTITY_CREATE 事件之后分发。若该任务是流程的一部分,本事件会在任务监听器执行前触发。
TASK_COMPLETED 任务已经完成。本事件在 ENTITY_DELETE 事件前分发。若该任务是流程的一部分,本事件会在流程前进之前触发,并且会跟随一个 ACTIVITY_COMPLETE 事件,指向代表该任务的节点。
PROCESS_CREATED 流程实例已经创建。已经设置所有的基础参数,但还未设置变量。
PROCESS_STARTED 流程实例已经启动。在启动之前创建的流程时分发。PROCESS_STARTED事件在相关的ENTITY_INITIALIZED事件,以及设置变量之后分发。
PROCESS_COMPLETED 流程实例已经完成。在最后一个节点的 ACTIVITY_COMPLETED 事件后分发。当流程实例没有任何路径可以继续时,流程结束。
PROCESS_COMPLETED_WITH_TERMINATE_END_EVENT 流程已经到达终止结束事件(terminate end event)并结束。
PROCESS_CANCELLED 流程已经被取消。在流程实例从运行时中删除前分发。流程实例由API调用RuntimeService.deleteProcessInstance取消。
MEMBERSHIP_CREATED 用户已经加入组。本事件包含了相关的用户和组的id。
MEMBERSHIP_DELETED 用户已经从组中移出。本事件包含了相关的用户和组的id。
MEMBERSHIPS_DELETED 组的所有用户将被移出。本事件在用户移出前抛出,因此关联关系仍然可以访问。因为性能原因,不会再为每个被移出的用户抛出 MEMBERSHIP_DELETED 事件。

代码示例

在bpmn20.xml的process节点下面添加全局监听

1
2
3
4
5
6
7
8
9
<process id="aacopy" name="aacopy" isExecutable="true">
<extensionElements>
<flowable:eventListener delegateExpression="${myEventListener}"/>
</extensionElements>
<startEvent id="startEvent1"/>

...

</process>

编写java代码,这里监听了任务的创建,任务审批完成,任务回退事件,用于常见工作流业务需求中的,审批,驳回等操作,可以在此操作中修改流程变量,调用业务系统接口,或者给消息队列发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class MyEventListener implements FlowableEventListener {

@Override
public void onEvent(FlowableEvent event) {
if(FlowableEngineEventType.TASK_CREATED.equals(event.getType())) { //任务创建
TaskEntity taskEntity = (TaskEntity) ((org.flowable.common.engine.impl.event.FlowableEntityEventImpl) event).getEntity();
// TODO 通过taskEntity获取任务相关数据,执行业务逻辑
} else if(FlowableEngineEventType.TASK_COMPLETED.equals(event.getType())) { //任务完成
TaskEntity taskEntity = (TaskEntity) ((org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl) event).getEntity();
} else if(FlowableEngineEventType.ACTIVITY_CANCELLED.equals(event.getType())) { //处理节点取消事件(驳回,撤回)
DelegateExecution delegateExecution = ((FlowableActivityCancelledEventImpl) event).getExecution();
}
}
}