之前写过一篇基础篇,说了一下流程定义,列表和完成任务等相关功能。这一篇就写一下进阶的内容,说一下监听器,多实例等相关功能。
1.监听器
监听器一般分为三类:JavaDelegate、TaskListener、ExecutionListener。
绑定对应的流程节点用于处理一下自定义的业务逻辑。
JavaDelegate:任务完成前触发,通过java代码实现业务逻辑。一般可用于实现抄送、计算、调用接口,一般可配置为异步处理,不会停留。
TaskListener:任务时间处理器,监听任务,可在任务创建、完成、分配时触发。一般可用于动态设置处理人、发送消息、抄送等。
ExecutionListener:流程监听器,流程开始、结束、节点进入时触发。一般用于最后结束更新流程相应的业务数据状态,记录等操作。
根据这三个监听器类型,分别给出一个样例用于理解。
1.1 JavaDelegate
我通过javaDelegate实现了抄送功能。下面给出xml和相关代码说明。
xml中,通过委托表达式绑定对应的javaBean。由于我们页面上需要展示流程配置了哪个用户进行抄送,我的实现方式是通过拓展变量实现。
插入一个知识点: 如果是通过全类名绑定,监听器bean的创建方式是newInstance(),如果你在里面有别的依赖,spring是不会注入bean进去的。 通过委托代理表达式delegateExpression才会讲delegate放入spring管理。
大概就是这样,后续可以按照自己定义的业务逻辑去实现。
1.2 TaskListener
监听任务节点,通过运行中的数据去做业务处理。
可以看到,这里我用的是类的全路径,做一个对比,如果你不需要注入别的依赖,用这个也可以。
1.3 ExecutionListener
我是通过流程监听器实现了一个流程结束后对业务数据进行更新的一个通用的监听器。
我们的流程结束监听器,最好只是一个入口,根据不同流程类型去执行不同的业务方法。因为每个流程对应的业务不同,但是对于触发事件来说都是一致的。
建议: 可以给每个流程创建一个策略,通过策略模式去处理,根据不同的流程类型执行不同的策略。策略类型可以在发起流程的时候,放入流程变量中,这样会比较方便。
1.4 全局监听器
通过实现FlowableEventListener,实现全局监听,一般可用于记录日志或者发送消息。不需要在xml中进行绑定。
2.多实例
一般我们的流程定义中,有些流程需要会签和或签功能。 会签:全部人审批完才能走到下一步。 或签:其中一个人审批了即可。
注意: 后续的通过条件需要自行通过表达式配置。全部人完成和全部人通过不是一个概念,这个到时候写流转表达式的时候需要注意。
collection就是多实例的用户集合,建议还是通过表达式获取。 elementVariable:元素变量,创建任务的时候,需要映射到task的assignee上。 completionCondition:通过条件。例如说或签的时候,就是有一个人完成即可,如果通过和不通过走向不同,需要加多一个条件。
跟上述一致,我需要展示选择的多实例用户,因此使用了拓展变量去存储用户id。 我只需要发起流程的时候,获取到变量,然后根据配置设置的流程变量中去,任务创建的时候,就会自动分配。刚好后端就不需要做什么特别的处理了(只是一般情况,特殊情况得按照自己情况进行处理。)