工作流学习-flowable监听器使用

2,056 阅读5分钟

流程引擎监听器分别为执行监听器(ExecutionListener)、任务监听器(TaskListener)、事件监听器(Event Listener)。 以下对工作流中此类监听器进行详述。

1、执行监听器

使用场景:

执行监听器是针对流程执行路径(Execution)上的特定阶段进行监听的。它会在流程执行过程中的关键点上触发,如流程实例创建、开始、结束、活动节点切换等时刻。使用执行监听器的典型场景包括:

在流程实例启动时初始化上下文数据。

在流程流转到某个节点前或后验证业务规则或计算数据。

当流程从一个活动节点转移到另一个节点时,执行一些通用的数据处理操作,如更新业务对象的状态、计算动态路由条件等。

总而言之,执行监听器是针对流程的流向进行监听,可以理解为流程的流指向。如下图展示。

微信截图_20240220112037.png

实现方式:

  1. 配置全限定名进行代码映射

  2. 配置表达式进行代码映射

  3. 配置委托表达式进行代码映射

事件类型:

  1. start

当流程实例启动或者活动(Activity)开始执行时触发。这通常发生在流程实例的生命周期初期,例如当一个流程启动或进入一个新的活动节点(如用户任务、服务任务、脚本任务等)时

  1. end

当流程实例结束或者某个活动完成其执行时触发。这意味着流程实例即将从当前活动切换到下一个活动,或者是整个流程实例即将结束。

  1. take

该事件主要与流程流转相关,特别是当流程实例从一个序列流向另一个序列流转移时触发。在BPMN规范中,序列流(Sequence Flow)是连接两个活动的路径,当流程沿着序列流进行流转时,会在转移过程中触发 take 事件。

本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图

微信截图_20240220112649.png

进行相应代码实现,实现如下:


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、 任务监 ****听器

使用场景:

任务监听器专注于处理用户任务相关的事件,例如任务创建、指派、完成和删除等。它常用于实现与用户交互相关的业务逻辑,例如:

当任务被创建时设置初始表单数据或自定义属性。

当任务被分配给某个用户时,发送通知或更新相关权限信息。

当用户完成任务时,验证提交的数据、更新业务系统状态或触发后续工作项。

事件类型:

  1. create:

当一个任务实例被创建,并且所有任务属性设置完成之后触发。在这个阶段,任务已经存在于流程中,但可能尚未分配给任何用户或组。常用于初始化任务状态、设置自定义字段值或发送通知等操作

  1. assignment:

当任务被指派给某个具体的用户或小组时触发。这个事件发生在create事件之前,确保当任务分配信息可用时就可以进行处理。可用于根据任务接收者动态修改任务属性,或者发送任务指派的通知邮件等。

  1. complete:

在任务被完成之前触发,即当用户完成任务并准备从流程实例中删除该任务时。通常用来执行清理工作、更新业务数据、跳转到下一个流程步骤或者其他与任务结束相关的逻辑。

  1. delete:

在任务即将从流程实例中删除前触发。此时任务已完成其生命周期,用来执行最终清理或记录日志。

实现方式:

  1. 配置全限定名进行代码映射

  2. 配置表达式进行代码映射

  3. 配置委托表达式进行代码映射

本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图

微信截图_20240220113426.png

代码实现方式如下:

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、事件 ****听器

使用场景:

事件监听器主要用于全局级别的事件处理,它可以监听流程实例生命周期中的特定事件,以及流程定义、任务、作业等各种实体相关的事件。例如,当一个流程实例启动、结束或者流程中发生错误时,可以通过事件监听器来触发相应的业务逻辑。这类监听器通常用于记录审计日志、更新相关数据库状态、发送通知邮件等跨节点或全局范围的操作。

事件类型:

QQ截图20240220120326.png

实现方式:

  1. 实现FlowableEventListener

  2. 使用API(RuntimeService)为引擎添加或删除事件监听器,请注意,运行时新增的监听器在引擎重启后不会保持

本文介绍第一种方式,其他方式后续拓展,配置全限定名,如下图

微信截图_20240220120528.png

代码实现方式如下:

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流程引擎的各个监听器使用场景及实现方式,如下为整理的思维导图

QQ截图20240220120840.png