Bootstrap

【Flowable | 第三篇】flowable工作流使用任务监听器、执行监听器

在这里插入图片描述

4.flowable工作流使用任务监听器、执行监听器

4.1任务监听器

  1. 任务监听器,即用于监听任务,可以监听任务的创建、分配、完成、以及删除共四个事件。
  2. TaskListener 的事件类型和执行时机是与任务相关的,它可以访问任务相关的信息,并可以对任务进行操作(例如设置任务的执行人、指定任务的代理人等),因此通常用于处理与任务相关的事件。
  3. 事件触发类型:
    1. create(创建):在任务被创建且所有的任务属性设置完成后才触发
    2. assignment(指派):在任务被分配给某个办理人之后触发
    3. complete(完成):在配置了监听器的上一个任务完成时触发
    4. delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发
  4. 事件类型:
    1. 类 (示例:com.owater.demoflowable.listener.FlowExecutionListener)
    2. 表达式(使用的是Spring EL表达式)
    3. 委托表达式

4.2执行监听器

  1. 执行监听器,针对整个流程实例的事件监听器,它可以监听流程实例启动、结束、活动开始、活动结束、连线选择等事件。
  2. ExecutionListener 的事件类型和执行时机都是固定的,它不能直接访问任务相关的信息(例如任务的候选人、任务的执行者等),因此通常用于处理与流程实例相关的事件。
  3. 事件触发类型: 启动(start)、结束(end)、在用(take)
  4. 事件类型:
    1. 类(示例:com.owater.demoflowable.listener.FlowExecutionListener)
    2. 表达式(使用的是Spring EL表达式)
    3. 委托表达式

img

  1. 区分点:
    1. 能否访问任务相关信息(任务候选人、任务执行者):
      1. 执行监听器是针对整个流程实例的事件监听器,它可以监听流程实例启动、结束、活动开始、活动结束、连线选择等事件;执行时机都是固定的,它不能直接访问任务相关的信息
      2. 任务监听器可以访问
  2. 作用:
    1. 动态分配节点处理人。通过前一个节点设置的变量,在运行到下一个节点时设置对应的处理人;
    2. 当流程运行到某个节点时,发送邮件或短信给待办用户;

4.2配置任务/执行监听器

4.2.1新增任务监听器

package org.dromara.workflow.listener;

/**
 * 自定义任务监听器
 */
@Slf4j
@Component()
public class MyTaskListener implements TaskListener {

    public void notify(DelegateTask delegateTask) {
        System.out.println("============自定义任务监听器 start============");
        String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
        String eventName = delegateTask.getEventName();
        System.out.println("事件名称:" + eventName);
        System.out.println("监听器:" + taskDefinitionKey);
        System.out.println("============自定义任务监听器 end============");
    }
}

4.2.2新增执行监听器

package org.dromara.workflow.listener;
/**
 *  自定义执行监听器
 */
@Slf4j
@Component
public class MyExecutionListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution)  {
        System.out.println("============自定义执行监听器 start============");
        String eventName = execution.getEventName();
        String currentActivitiId = execution.getCurrentActivityId();
        System.out.println("事件名称:" + eventName);
        System.out.println("执行器:" + currentActivitiId);


        System.out.println("============自定义执行监听器  end============");
    }

}

4.2.2任务节点配置任务/执行监听器

(1)选择类的类型
  1. 选择监听器触发事件
  2. 选择类型:类/表达式/委托表达式
  3. 类:填写监听器所在包路径+类名

image-20240717210007603

image-20240717210127019

image-20240717210218280

(2)使用表达式类型

image-20240717211629825

  1. Flowable 的表达式语法类似Spring EL,
  2. ${testExpress.test()} testExpress代表对象名,因为@Component生成的对象名默认以类名称命名
  3. testExpress.test() 代表调用testExpress的test()方法
@Slf4j
@Component
public class TestExpress {

    public void test() {
        log.info("TestExpress被调用了");
    }

}
(3)使用委托表达式

image-20240717211805590

  1. ${flowTaskListener} 映射 命名为 flowTaskListener 的对象

    @Slf4j
    @Component
    public class FlowTaskListener implements TaskListener {
    
        @Override
        public void notify(DelegateTask delegateTask) {
            log.info("任务监听器:{}", delegateTask);
        }
    
    }
    
    

4.3测试

  1. 填写一个请假表单,流程到达组长审批 节点,触发任务监听器和执行监听器
  2. 首先触发start事件,调用我们自定义的执行监听器,随后触发assignment和create事件,执行自定义任务监听器的内容

image-20240717204543506

  1. 当组长审批节点 提交后,观看控制台输出:首先触发complete事件再触发delete事件,最后触发end事件

image-20240717210607506

4.4小结

  1. ExecutionListener 和 TaskListener 都是 Flowable 提供的事件监听器,TaskListener 是针对任务的事件监听器,ExecutionListener 是针对整个流程实例的事件监听器
  2. 任务监听器有四个触发事件:指派、创建、完成、删除
  3. 执行监听器有三个触发事件:开始、结束、启用
  4. 若一个任务节点同时设置任务/执行监听器,触发顺序如下:
    1. 流程到达该节点:执行监听器的开始事件——>任务监听器的指派、创建事件
    2. 该节点提交:任务监听器的完成、删除事件——>执行监听器的结束事件
  5. 后面将学习flowable的任务多实例、节点会签/或签、审批动作(委托、转办、退回、终止等)
;