------------------第一篇---------------------------------------------------------
Flowable 监听器
Flowable 有3种监听器,相关内容在开发文档中有详细的说明:
- 事件监听器(Flowable 开发文档 3.18)
- 执行监听器(Flowable 开发文档 8.5.13)
- 任务监听器(Flowable 开发文档 8.5.14)
找到的资料一般只提到后2种,事件监听器可能会分开说明。
分别实现下面的接口,重写相应的方法可以实现监听。
// 事件监听器接口,可全局监听整个流程 | |
org.flowable.common.engine.api.delegate.event.FlowableEventListener; | |
// 执行监听器,可监听每一个组件,整个流程也可以配置 | |
org.flowable.engine.delegate.ExecutionListener; | |
// 任务监听器,主要用来监听节点 | |
org.flowable.engine.delegate.TaskListener; |
实现了相应的监听器后,还要在流程设计器中与流程配置绑定才能生效。
事件监听器
可实现流程的全局监听,监听的粒度比较细。支持的监听事件列表可参考开发文档3.18.6。
找到资料24. flowable 全局监听,继承下面的接口,再重写与事件对应的方法。感觉这种方式要好用一些。
org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; |
另外,开发文档 3.18.3 里面有说明,利用 RuntimeService
就可以在运行时添加监听器。
FlowableEventListener和AbstractFlowableEngineEventListener都是Flowable流程引擎中用于事件监听的重要组件,但它们在定义、用途和实现方式上有所不同。以下是两者的具体区别:
一、定义与接口
FlowableEventListener
- 定义:FlowableEventListener是Flowable流程引擎提供的一个接口,用于监听流程引擎中的事件。
- 接口方法:它包含一个
onEvent(FlowableEvent event)
方法,当流程引擎中的事件发生时,此方法会被调用。AbstractFlowableEngineEventListener(更好用)
- 定义:AbstractFlowableEngineEventListener是Flowable流程引擎中的一个抽象类,它实现了FlowableEventListener接口,并提供了一些默认实现和附加功能。
- 抽象方法与重写:它包含多个与流程引擎事件相关的方法,如
taskCreated
、variableCreated
、processCreated
等,这些方法在特定类型的事件发生时会被调用。开发者可以通过继承这个抽象类并重写这些方法来实现自定义的事件监听逻辑。二、用途与功能
FlowableEventListener
- 用途:主要用于监听流程引擎中的全局事件,如流程实例的启动、结束,任务的创建、分配、完成等。
- 功能:通过实现该接口,开发者可以自定义监听逻辑,在事件发生时执行特定的操作,如记录日志、发送通知等。
AbstractFlowableEngineEventListener
- 用途:与FlowableEventListener类似,但提供了更细粒度的事件监听能力。它允许开发者监听更具体的事件类型,如任务的创建、变量的创建等。
- 功能:通过继承这个抽象类并重写相关方法,开发者可以实现更具体的事件监听逻辑。此外,该抽象类还提供了一些默认实现,简化了事件监听器的开发过程。
三、实现方式
FlowableEventListener
- 实现方式:开发者需要实现FlowableEventListener接口,并重写
onEvent(FlowableEvent event)
方法。在方法中,可以根据事件类型(通过event.getType()
获取)执行相应的逻辑。AbstractFlowableEngineEventListener
- 实现方式:开发者需要继承AbstractFlowableEngineEventListener抽象类,并重写与所需事件类型相关的方法。在重写的方法中,可以直接编写事件处理逻辑。
四、使用场景与注册方式
使用场景
- FlowableEventListener适用于需要监听全局事件且事件类型较为广泛的场景。
- AbstractFlowableEngineEventListener适用于需要监听具体事件类型且希望简化开发过程的场景。
注册方式
- 对于FlowableEventListener,可以通过调用ProcessEngineConfiguration的
addEventListener
方法将其添加到流程引擎中。- 对于AbstractFlowableEngineEventListener,同样可以通过上述方式注册到流程引擎中,但由于它是抽象类,需要先创建其子类实例后再进行注册。
综上所述,FlowableEventListener和AbstractFlowableEngineEventListener在定义、用途、实现方式和使用场景等方面都存在差异。开发者在选择使用哪个组件时,应根据具体需求和场景进行权衡和选择。
接口实现
实现FlowableEventListener
@Component | |
public class WorkFlowListener implements FlowableEventListener { | |
@Override | |
public void onEvent(FlowableEvent event) { | |
System.out.println("全局监听:WorkFlowListener"); | |
} | |
@Override | |
public boolean isFailOnException() { | |
return false; | |
} | |
@Override | |
public boolean isFireOnTransactionLifecycleEvent() { | |
return false; | |
} | |
@Override | |
public String getOnTransaction() { | |
return null; | |
} | |
} |
实现 AbstractFlowableEngineEventListener
@Component | |
public class WorkFlowListener1 extends AbstractFlowableEngineEventListener { | |
@Override | |
protected void taskCreated(FlowableEngineEntityEvent event) { | |
System.out.println("全局监听:WorkFlowListener1-任务创建"); | |
} | |
@Override | |
protected void variableCreated(FlowableVariableEvent event) { | |
System.out.println("全局监听:WorkFlowListener1-创建变量"); | |
} | |
@Override | |
protected void processCreated(FlowableEngineEntityEvent event) { | |
System.out.println("全局监听:WorkFlowListener1-创建流程"); | |
} | |
@Override | |
protected void processStarted(FlowableProcessStartedEvent event) { | |
System.out.println("全局监听:WorkFlowListener1-开始流程"); | |
} | |
@Override | |
protected void taskAssigned(FlowableEngineEntityEvent event) { | |
System.out.println("全局监听:任务分配"); | |
} | |
} |
配置
模型设计器中,不选中任何组件,可在流程级别配置事件监听器、执行监听器。
添加事件监听器需要先选择监听的事件类型。
- 类:写全限定类名;
- 代理表达式:写注入到 Spring 中 Bean 名称,如:
${testEventListener}
; - 实体类型:可用值 见 文档 3.18.6。所有的
ENTITY_\*
事件都与实体关联。
类、表达式写其中一个就可以了,实体类型也只有监听 ENTITY_
开头的事件时需要填写,还未实测过。文档大概是建议写类名,写类名每次都是实例化新的实例。而使用代理表达式的话,Spring 中一般都是用的单例模式,可能存在线程安全问题。相关内容在 8.5.3 Java 服务任务-字段注入与线程安全 中有描述。
配置多个监听器
配置抛出事件
可配置的抛出事件,还未实测。
执行监听器
支持流程级别监听。
可监听的事件
- 流程实例的启动和结束。
- 流程执行转移。
- 活动的启动和结束。
- 网关的启动和结束。
- 中间事件的启动和结束。
- 启动事件的结束,和结束事件的启动。
具体选项
start 开始 | |
take 启用 | |
end 结束 |
在转移上只会触发
take
事件。当监听器定义在转移上时,event
属性的值将被忽略。
接口实现
@Component | |
public class TestExecutionListener implements ExecutionListener { | |
@Override | |
public void notify(DelegateExecution execution) { | |
System.out.println("执行监听器:" + execution.getEventName()); | |
} | |
} |
配置
配置可参考事件监听器。还可配置表达式及字段注入,还未实测。文档中有相关说明。
任务监听器
只能监听用户任务;如果监听器不存在是会报错的。
可监听的事件
create 任务已经创建 | |
assignment 已经分配办理人 | |
complete 任务已经完成 | |
delete 任务即将被删除 |
执行的顺序 :
assignment 分配办理人 → create 创建 → complete 完成 → delete 删除
文档中相关解释:
请注意:当流程执行到达用户任务时,在触发create事件之前,会首先触发assignment事件。这顺序看起来不太自然,但是有实际原因的:当收到create事件时,我们通常希望能看到任务的所有参数,包括办理人。
接口实现
@Component | |
public class UserTaskListener implements TaskListener { | |
@Override | |
public void notify(DelegateTask delegateTask) { | |
System.out.println("节点监听:" + delegateTask.getEventName()); | |
} | |
} |
配置
配置可参考事件监听器。还可配置表达式及字段注入,还未实测。文档中有相关说明。
本文作者:JamKing
-------------------------第二篇--------------------------------------------------------
https://juejin.cn/post/7337647568573399092
流程引擎监听器分别为执行监听器(ExecutionListener)、任务监听器(TaskListener)、事件监听器(Event Listener)。 以下对工作流中此类监听器进行详述。
1、执行监听器:
使用场景:
执行监听器是针对流程执行路径(Execution)上的特定阶段进行监听的。它会在流程执行过程中的关键点上触发,如流程实例创建、开始、结束、活动节点切换等时刻。使用执行监听器的典型场景包括:
在流程实例启动时初始化上下文数据。
在流程流转到某个节点前或后验证业务规则或计算数据。
当流程从一个活动节点转移到另一个节点时,执行一些通用的数据处理操作,如更新业务对象的状态、计算动态路由条件等。
总而言之,执行监听器是针对流程的流向进行监听,可以理解为流程的流指向。如下图展示。
实现方式:
-
配置全限定名进行代码映射
-
配置表达式进行代码映射
-
配置委托表达式进行代码映射
事件类型:
- start
当流程实例启动或者活动(Activity)开始执行时触发。这通常发生在流程实例的生命周期初期,例如当一个流程启动或进入一个新的活动节点(如用户任务、服务任务、脚本任务等)时
- end
当流程实例结束或者某个活动完成其执行时触发。这意味着流程实例即将从当前活动切换到下一个活动,或者是整个流程实例即将结束。
- take
该事件主要与流程流转相关,特别是当流程实例从一个序列流向另一个序列流转移时触发。在BPMN规范中,序列流(Sequence Flow)是连接两个活动的路径,当流程沿着序列流进行流转时,会在转移过程中触发 take 事件。
本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图
进行相应代码实现,实现如下:
js
代码解读
复制代码
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:
在任务即将从流程实例中删除前触发。此时任务已完成其生命周期,用来执行最终清理或记录日志。
实现方式:
-
配置全限定名进行代码映射
-
配置表达式进行代码映射
-
配置委托表达式进行代码映射
本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图
代码实现方式如下:
js
代码解读
复制代码
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)为引擎添加或删除事件监听器,请注意,运行时新增的监听器在引擎重启后不会保持
本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图
代码实现方式如下:
js
代码解读
复制代码
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流程引擎的各个监听器使用场景及实现方式,如下为整理的思维导图
标签:
话题:
作者:dwk
链接:https://juejin.cn/post/7337647568573399092
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。