flowable的监听器顺序
监听器
flowable的监听器分两种:
- 执行监听器:3种,start,take,end
- 任务监听器:4种,assignment,create,complete,delete
对于执行监听器:
- 节点只会触发两种:start,end
- 连线会触发三种:start,take,end
测试
如图,一个工作流上有X、Y、Z三个节点,节点X经判断条件流向节点Y。现在:
- 节点X-判断的连线:添加3种事件监听器:start、take、end,每种事件监听器各2个。
- 判断-节点Y的连线:添加3种事件监听器:start、take、end,每种事件监听器各2个。
- 节点Y:
- 添加2种事件监听器:startA、startB
- 添加4种任务监听器:assignment、create、complete、delete,其中create和complete各2个。
同类监听器的添加顺序与数字顺序相同,例如create1先添加,create2后添加。
运行流程,得到运行的先后顺序:
- 节点X-判断的连线:
- start1-1
- start1-2
- take1-1
- take1-2
- end1-1
- end1-2
- 判断-节点Y的连线:
- start2-1
- start2-2
- take2-1
- take2-2
- end2-1
- end2-2
- 节点Y:
- start
- assignment
- create1
- create2
- complete1
- complete2
- delete
- end
当X节点完成,此时流程流向Y节点,但Y节点尚未审批,那么这个过程会依次触发:
- 节点X-判断的连线:start、take、end
- 判断-节点Y的连线:start、take、end
- 节点Y:start、assignment、create1、create2
当Y节点审批完成,那么会依次触发:
- 节点Y:complete1、complete2、delete、end
结论
根据测试,可得出以下结论:
- 节点和连线的监听器是按其流程顺序触发的,前面的节点/连线的所有监听器完成,后面的节点/连线的监听器才会触发。
- 每段连线都是独立的,会按先后顺序触发监听器。
- 对于一个节点,其监听器的触发顺序是:
- 执行监听器start
- 任务监听器assignment,create
- (用户审批操作)
- 任务监听器complete,delete
- 执行监听器end
- 任务监听器assignment 是在 任务监听器create之前触发的。
- 审批完成会删除Task,因此正常流程下delete是会触发的。
- 任务监听器的delete在执行监听器的end之前触发,因此在执行监听器end中是无法通过上下文变量(参数)获取Task对象的。
节点的监听器执行顺序如下:
注意
若要在同一个节点下添加多个相同事件,例如添加complete1、complete2,虽然这些事件会按添加顺序触发,但需要考虑事件内部是否有异步操作。若是,则无法确保异步操作也是按顺序执行的。
由于create和complete中间有一步用户审批的人工操作,因此先触发的放到事件create中,后触发的放到事件complete中通常能保证执行顺序。
如果明确异步操作耗时不高,也可以将先触发的放到事件complete中,后触发的放到事件end中。