流程引擎监听器分别为执行监听器(ExecutionListener)、任务监听器(TaskListener)、事件监听器(Event Listener)。 以下对工作流中此类监听器进行详述。
1、执行监听器:
使用场景:
执行监听器是针对流程执行路径(Execution)上的特定阶段进行监听的。它会在流程执行过程中的关键点上触发,如流程实例创建、开始、结束、活动节点切换等时刻。使用执行监听器的典型场景包括:
在流程实例启动时初始化上下文数据。
在流程流转到某个节点前或后验证业务规则或计算数据。
当流程从一个活动节点转移到另一个节点时,执行一些通用的数据处理操作,如更新业务对象的状态、计算动态路由条件等。
总而言之,执行监听器是针对流程的流向进行监听,可以理解为流程的流指向。如下图展示。
实现方式:
-
配置全限定名进行代码映射
-
配置表达式进行代码映射
-
配置委托表达式进行代码映射
事件类型:
- start
当流程实例启动或者活动(Activity)开始执行时触发。这通常发生在流程实例的生命周期初期,例如当一个流程启动或进入一个新的活动节点(如用户任务、服务任务、脚本任务等)时
- end
当流程实例结束或者某个活动完成其执行时触发。这意味着流程实例即将从当前活动切换到下一个活动,或者是整个流程实例即将结束。
- take
该事件主要与流程流转相关,特别是当流程实例从一个序列流向另一个序列流转移时触发。在BPMN规范中,序列流(Sequence Flow)是连接两个活动的路径,当流程沿着序列流进行流转时,会在转移过程中触发 take 事件。
本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图
进行相应代码实现,实现如下:
package com.demo;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
/** * @Title: EndEventListener *
@Package: com.wk.listeners *
@Description: *
@Author: DWK *
@Version:1.0 *
/@Component("executelistener")
public class EexecuteListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution{
System.out.println("EexecuteListener执行!!");
}
}
2、 任务监 ****听器
使用场景:
任务监听器专注于处理用户任务相关的事件,例如任务创建、指派、完成和删除等。它常用于实现与用户交互相关的业务逻辑,例如:
当任务被创建时设置初始表单数据或自定义属性。
当任务被分配给某个用户时,发送通知或更新相关权限信息。
当用户完成任务时,验证提交的数据、更新业务系统状态或触发后续工作项。
事件类型:
- create:
当一个任务实例被创建,并且所有任务属性设置完成之后触发。在这个阶段,任务已经存在于流程中,但可能尚未分配给任何用户或组。常用于初始化任务状态、设置自定义字段值或发送通知等操作
- assignment:
当任务被指派给某个具体的用户或小组时触发。这个事件发生在create事件之前,确保当任务分配信息可用时就可以进行处理。可用于根据任务接收者动态修改任务属性,或者发送任务指派的通知邮件等。
- complete:
在任务被完成之前触发,即当用户完成任务并准备从流程实例中删除该任务时。通常用来执行清理工作、更新业务数据、跳转到下一个流程步骤或者其他与任务结束相关的逻辑。
- delete:
在任务即将从流程实例中删除前触发。此时任务已完成其生命周期,用来执行最终清理或记录日志。
实现方式:
-
配置全限定名进行代码映射
-
配置表达式进行代码映射
-
配置委托表达式进行代码映射
本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图
代码实现方式如下:
package com.demo;
import cn.hutool.extra.spring.SpringUtil;
import com.wk.Constants.Constant;
import com.wk.Constants.StringPool;
import com.wk.util.RedisService;
import org.apache.commons.lang3.StringUtils;
import org.flowable.task.service.delegate.DelegateTask;
import org.flowable.task.service.delegate.TaskListener;
import org.springframework.stereotype.Component;
import java.util.Timer;
/**
* @Title: UserCreateTaskListener
* @Package: com.wk.listeners.test
* @Description:
* @Author: daiwenke
* @Version:1.0
*/
@Component("taskListener")
public class TaskListener implements TaskListener {
// TODO: 2023/12/12 0012 上线设置为20min
private static final long defaultTaskDelayTime = 10000;
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("UserCreateTaskListener taskId:" + delegateTask.getId() + "now task user:" + delegateTask.getAssignee());
}
}
3、事件 监 ****听器
使用场景:
事件监听器主要用于全局级别的事件处理,它可以监听流程实例生命周期中的特定事件,以及流程定义、任务、作业等各种实体相关的事件。例如,当一个流程实例启动、结束或者流程中发生错误时,可以通过事件监听器来触发相应的业务逻辑。这类监听器通常用于记录审计日志、更新相关数据库状态、发送通知邮件等跨节点或全局范围的操作。
事件类型:
实现方式:
-
实现FlowableEventListener
-
使用API(RuntimeService)为引擎添加或删除事件监听器,请注意,运行时新增的监听器在引擎重启后不会保持
本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图
代码实现方式如下:
package com.demo;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.common.engine.api.delegate.event.FlowableEventType;
import org.flowable.common.engine.impl.event.FlowableEntityEventImpl;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.ProcessEngines;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.service.delegate.DelegateTask;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @Title: GlobalEventListener
* @Package: com.wk.listeners
* @Description: 全局事件监听,发送微信-事件上报
* @Author: dwk
* @Version:1.0
*/
@Component
@RequiredArgsConstructor
public class EventListener implements FlowableEventListener {
private final Logger logger = LoggerFactory.getLogger(GlobalEventListener.class);
@Override
public void onEvent(FlowableEvent flowableEvent) {
MessageService messageService = SpringUtil.getBean(MessageService.class);
TaskEntity taskEntity = (TaskEntity) ((FlowableEntityEventImpl) flowableEvent).getEntity();
if (judgeRollback(taskEntity)) {
logger.info("全局事件监听,驳回操作,设置历史审批人");
executePreTask(taskEntity);
}
logger.info("全局事件监听,发送微信事件-开始构建 varibale:{}", JSONObject.toJSON(taskEntity.getVariables()));
MessageInfoRequest request = buildWeiXinMsgRequest(taskEntity);
var result = messageService.sendMessage(request);
logger.info("全局事件监听,发送微信-事件上报完成! result:{}", JSONObject.toJSON(result));
}
@Override
public boolean isFailOnException() {
return false;
}
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
以上为flowable流程引擎的各个监听器使用场景及实现方式,如下为整理的思维导图