🎋并行编排
# 最基本的例子
如果你要并行执行a,b,c三个组件,你可以用WHEN
关键字,需要注意的是,WHEN
必须大写。
提示
从v2.11.4开始,你也可以用PAR
关键字,和WHEN
是等价的。
<chain name="chain1">
WHEN(a, b, c);
</chain>
# 和串行嵌套起来(一)
接下来,让我们把THEN
和WHEN
结合起来用,看一个示例:
<chain name="chain1">
THEN(
a,
WHEN(b, c, d),
e
);
</chain>
图示
在以上示例里,b,c,d默认并行都执行完毕后,才会执行e。
# 和串行嵌套起来(二)
上面的示例应该很好理解吧,那么再看一个示例:
<chain name="chain1">
THEN(
a,
WHEN(b, THEN(c, d)),
e
);
</chain>
图示
# 忽略错误
WHEN
关键字提供了一个子关键字ignoreError
(默认为false)来提供忽略错误的特性,用法如下:
<chain name="chain1">
THEN(
a,
WHEN(b, c, d).ignoreError(true),
e
);
</chain>
图示
以上假设b,c,d中任一一个节点有异常,那么最终e仍旧会被执行。
# 任一节点先执行完则忽略其他
WHEN
关键字提供了一个子关键字any
(默认为false)用来提供并行流程中,任一条分支先执行完即忽略其他分支,继续执行的特性。用法如下:
<chain name="chain1">
THEN(
a,
WHEN(b, THEN(c, d), e).any(true),
f
);
</chain>
图示
以上流程,假设e节点先执行完,那么不管其他分支是否执行完,会立马执行节点f。
# 指定任意节点先执行完则忽略其他
LiteFlow从v2.11.1开始,支持了并行编排中指定节点的执行则忽略其他,WHEN
关键字新增子关键字 must
(不可为空),可用于指定需等待执行的任意节点,可以为 1 个或者多个,若指定的所有节点率先完成,则继续往下执行,忽略同级别的其他任务,用法如下:
<chain name="chain1">
THEN(
a,
WHEN(b, c, d).must(b, c),
f
);
</chain>
以上流程中,must
指定了b,c,则b,c是一定会被执行完毕了,如果b,c执行完毕了后d还未执行完,则忽略,直接执行下一个组件f。
以上是单节点的用法,must还可以指定一个或多个表达式。比如
<chain name="chain1">
THEN(
a,
WHEN(b, THEN(c, d).id("t1"), e).must(b, "t1"),
f
);
</chain>
在这个表达式中WHEN
里有一个嵌套的THEN
,如果需要指定这个表达式,则需要给这个表达式设置一个id,must
里需要指定这个id,需要注意的是,must
里指定id,需要用引号括起来。
# 开启WHEN线程池隔离
目前liteflow设计里when线程池,如果你不单独设置自定义线程池,那么就会用默认的线程池。而这个线程池,是所有的when共同一个。
LiteFlow从2.11.1开始,提供一个liteflow.when-thread-pool-isolate
参数,默认为false
,如果设为true
,则会开启WHEN的线程池隔离机制,这意味着每一个when都会有单独的线程池。这个特性对于运行复杂的嵌套when时是可以提升运行速度的且规避掉一些锁的问题。
你可以如下配置来开启:
liteflow.when-thread-pool-isolate=true
# 关于组的概念
在以前的版本中,并行编排有组(group)的概念,而在2.8.X版本中,我们去除了组的概念。
用EL表达式,其实你写2个不同的WHEN就是2个组。比如:
<chain name="chain1">
THEN(
WHEN(a, b, c, d)
);
</chain>
以上abcd都在同一个并行组中。
<chain name="chain1">
THEN(
WHEN(a, b),
WHEN(c, d)
);
</chain>
以上例子,ab是一个并行组,而cd是另一个并行组。