前言
本篇不仅仅是讲解监听器功能,也是对上一篇深入探究Camunda加签问题使用执行监听器加签时为什么要在连线上设置的解答。
首先监听器分为ExecutionListener【执行监听器】和TaskListener【任务监听器】,我们知道不管是连线还是任务节点底层都有对应的执行器,所以ExecutionListener是可以设置在连线和节点上的。
接着我们说一下哪些场景下可以使用监听器去完成:
- 动态分配节点处理人
- 流程运行到某个节点时通知待办人
- 统计任务处理时间
- 处理业务逻辑
执行监听器
执行监听器的触发事件有:start、end、take;其中节点有start、end两种事件,而连线则有take事件。
给或签节点设置了开始事件和结束事件的执行监听器
开启一条流程实例测试一下,这里我们在发起流程时就把所有节点审批人参数设置好。
发起人节点调用审批通过后就触发或签节点的执行监听器开始事件,两次是因为该监听事件是设置在节点上的,而或签节点设置了两个处理人,所以它会创建两个待办任务,每个待办任务都有对应的执行器,等到或签节点有人审批通过了,就会触发执行监听器结束事件。
接下来我们改变一下设置审批人的方式,通过任务节点上的执行监听器去设置,【其实这里不需要测试的,想想就知道不行,为了能表达地更清晰吧】
publicclassCustomExecutionListenerimplementsExecutionListener { publicvoidnotify(DelegateExecutiondelegateExecution) throwsException { System.out.println("ExecutionListener--事件:【"+delegateExecution.getEventName()+"】--触发了"); if ("start".equals(delegateExecution.getEventName())){ List<String>userOneList=newArrayList<>(); userOneList.add("zhangsan"); userOneList.add("lisi"); delegateExecution.setVariable("userOneList",userOneList); } } }
当发起人节点审批后,会报错
说明在触发该监听器之前,流程引擎就需要知道该节点上有几个待办任务从而创建对应数量的执行器。这也是上一篇动态设置审批人时在节点前连线上设置执行监听器的原因。
当前你可以选择在节点上的执行监听器结束事件触发时去设置下一节点审批人,不过我感觉麻烦一点。
任务监听器
任务监听器的触发事件有:create, assignment, update, complete, delete or timeout。
这里我们演示常用的create、assignment、complete事件
重新部署后,把审批人设置方式再改回到发起流程时设置,然后发起流程实例,这里如果执行监听器的触发在任务监听器之前,那就更不能在任务监听器上动态设置审批人了。
先看红框标记部分,当任务监听器的完成事件触发后才会触发节点上执行监听器的结束事件,然后触发下一个节点的执行监听器开始事件,接着就是创建任务和分配任务时触发任务监听器。
绿框标记部分说明待办任务调用审批通过接口后会触发任务监听器的完成事件,如果满足了该节点完成条件,就会连续触发的待办任务对应的执行监听器结束事件。
所以动态设置审批人的条件就是要在节点执行监听器的开始事件触发之前就设置好审批人参数。
总结
附图一张,撒花完结。