likes
comments
collection
share

Flowable 任务监听器与执行监听器(二)

作者站长头像
站长
· 阅读数 11

前言

在流程设计当中,有时候我们需要流程启动前、中、后去触发一些事件,比如费用流程结束后需要将金额回写到SAP系统。所以在业务需求驱动下,我们需要对Flowable的事件监听器探索。

本文主要针对Flowable 的 ExecutionListener 和 TaskListener 如何使用进行探讨。

ExecutionListener 和 TaskListener 区别

ExecutionListener 和 TaskListener 都是 Flowable 提供的事件监听器,但它们的作用和用途有些不同。

ExecutionListener

ExecutionListener 是针对整个流程实例的事件监听器,它可以监听流程实例启动、结束、活动开始、活动结束、连线选择等事件。ExecutionListener 的事件类型和执行时机都是固定的,它不能直接访问任务相关的信息(例如任务的候选人、任务的执行者等),因此通常用于处理与流程实例相关的事件。

TaskListener

TaskListener 顾名思义它是针对任务的事件监听器,它可以监听任务的创建、分配、完成等事件。TaskListener 的事件类型和执行时机是与任务相关的,它可以访问任务相关的信息,并可以对任务进行操作(例如设置任务的执行人、指定任务的代理人等),因此通常用于处理与任务相关的事件。


▼ TaskListener 如何使用 ▼


  • 事件触发状态有流程:
    • create(创建):在任务被创建且所有的任务属性设置完成后才触发
    • assignment(指派):在任务被分配给某个办理人之后触发
    • complete(完成):在配置了监听器的上一个任务完成时触发
    • delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发
  • 事件类型:
    • 类 (示例:com.owater.demoflowable.listener.FlowExecutionListener)
    • 表达式
    • 委托表达式
  • 事件类型的值:
    • 类 对应类的全路径
    • 表达式 使用的是Spring EL表达式
事件类型使用'类'

创建一个类FlowTaskListener

@Slf4j
@Component
public class FlowTaskListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
        log.info("任务监听器:{}", delegateTask);
    }

}

配置执行监听器,如下图: Flowable 任务监听器与执行监听器(二)

xml如下:

<extensionElements>
    <flowable:taskListener class="com.owater.demoflowable.listener.FlowTaskListener" event="create" />
</extensionElements>
事件类型使用'表达式'

Flowable 任务监听器与执行监听器(二)

xml如下:

<extensionElements> 
    <flowable:taskListener expression="${flowTaskListener.test()}" event="create" /> 
</extensionElements>

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

@Slf4j
@Component
public class TestExpress {

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

}
事件类型使用'委托表达式'

Flowable 任务监听器与执行监听器(二)

xml定义如下:

<extensionElements> 
    <flowable:taskListener delegateExpression="${flowTaskListener}" event="create" /> 
</extensionElements>

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

@Slf4j
@Component
public class FlowTaskListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
        log.info("任务监听器:{}", delegateTask);
    }

}

▼ ExecutionListener 如何使用 ▼


  • 事件触发状态有流程:启动(start)、结束(end)、在用(take)
  • 事件类型:
    • 类(示例:com.owater.demoflowable.listener.FlowExecutionListener)
    • 表达式
    • 委托表达式
  • 事件类型的值:
    • 类 对应类的全路径
    • 表达式 使用的是Spring EL表达式
  • 事件参数:可以配置参数传递到事件中
事件类型使用'类'

创建一个类FlowExecutionListener

@Slf4j
@Component
public class FlowExecutionListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        log.info("执行监听器:{}", execution);
    }

}

配置执行监听器,如下图

Flowable 任务监听器与执行监听器(二)

对应xml配置

<extensionElements>
    <flowable:executionListener class="com.owater.demoflowable.listener.FlowExecutionListener" event="start">
        <!--配置参数-->
        <flowable:field name="amount" stringValue="100" />
    </flowable:executionListener>
</extensionElements>
事件类型使用'表达式'

和上文的FlowTaskListener类似,我就不重复了

事件类型使用'委托表达式'

也是和上文的FlowTaskListener类似,偷懒了

总结

看完本文,会发现 Flowable 监听器使用其实并不难,而且可以很灵活地扩展我们的业务。