同步异步编排
# 概述
提示
同步和异步节点的编排在LiteFlow是一个核心概念,这章建议学习LiteFlow的小伙伴仔细看看。涉及了大量核心概念。
# 同步流程块
LiteFlow提供了同步流程块和异步流程块,配置起来非常简单
以下为同步流程块,表示a,b,c,d四个组件会挨个同步执行
<then value="a,b,c,d"/>
下面的方式和上面等价
<then value="a,b"/>
<then value="c,d"/>
# 异步流程块
以下为异步流程块,表示a,b,c,d四个组件会并行执行
<when value="a,b,c,d"/>
当然下面的方式也和上面等价
<when value="a,b"/>
<when value="c,d"/>
# 异步线程池
LiteFlow从2.5.0开始引入了异步流程块的线程池设定
你可以通过这样配置线程池大小以及等待队列
#异步线程池最大线程数
liteflow.when-max-workers=4
#异步线程池等待队列数
liteflow.when-queue-limit=100
# 异步并行组
如果有同学想并行执行a,b,等执行好了,再并行执行c,d,该怎么办呢?
从2.5.0版本开始,引入了group
的概念,你只需这么配置就行了
<when group="g1" value="a,b"/>
<when group="g2" value="c,d"/>
LiteFlow规定,2个不同组的when是按照配置的顺序执行的,相同组的when是完全并行的。如果不配,默认组是default
,所以不配置组默认就是在同一组内的
# 相同异步并行组之间的抛错
不配置group
或者配成一样的,那无论有多少个<when>
还是你一个<when>
里有配置了多个组件,都是等价的。都会并行执行。
那么有一个组件抛错,其他组件依旧会执行。等到整个when结束后,才会抛错出来。
# 不同异步并行组之间的抛错
如果2个并行组之间,有一组任一节点报错。不想执行下一个并行组怎么办,从2.5.0版本开始,引入了一个参数errorResume
,你可以这样配置
<when group="g1" errorResume="false" value="a,b"/>
<when group="g2" value="c,d"/>
上面的配置表示,默认就是false,所以不配置也行,如果g1并行组件a和b有一个执行报错,则第二个<when>
不会执行
如果设为true,如果并行组g1中任意一个节点抛出异常,则g2并行组,依旧执行
# 相同异步并行组之间的抛错
思考以下问题,如果有以下流程,第一个并行组出错还继续,第二个出错不继续。那么如果c报错,会走到e么
<when errorResume="true" value="a,b"/>
<when errorResume="false" value="c,d"/>
<then value="e"/>
应该是会走到e,因为他们是相通并行组,LiteFlow会进行合并,合并的话,errorResume
会参照第一个来进行。也就等价于:
<when errorResume="true" value="a,b,c,d"/>
<then value="e"/>
所以会走到e
# 异步任一线程结束即继续
LiteFlow从2.6.4开始,支持了异步组件任意一个结束即继续的特性。
如果有以下流程:
<chain name="chain1">
<when value="a,b,c"/>
<then value="d"/>
</chain>
表示a,b,c三个并行,但是要等到a,b,c都执行完了,才能执行d。
如果要达成a,b,c任意一个执行完,即执行d,你需要这么配置
<chain name="chain1">
<when value="a,b,c" any="true"/>
<then value="d"/>
</chain>
这样就可以达成了。是不是很简单。
思考如下的场景:
<chain name="chain1">
<when value="a1,b1,c1" any="true"/>
<when value="a2,b2,c2"/>
<then value="d"/>
</chain>
如果b1最先执行完,那么会不会接下去执行a2,b2,c2中的某一个?
答案是不会,有可能b1会先执行完,然后直接执行d,然后再进行执行后续的其他节点。
为什么会跳过第二个when呢,因为上面说过了。相同并行组会合并的,并以第一个when上的参数为准,以上就等价于:
<chain name="chain1">
<when value="a1,b1,c1,a2,b2,c2" any="true"/>
<then value="d"/>
</chain>
所以换成以上这种形式,是不是就好理解点了?