🍽决策路由用法
版本支持:v2.12.0+
# 路由规则体
在定义规则的时候,新增了一个<route>
和<body>
标签:
<chain name="chain1">
<route>
AND(r1, r2, r3)
</route>
<body>
THEN(a, b, c);
</body>
</chain>
<chain name="chain2">
<route>
AND(OR(r4, r5), NOT(r3))
</route>
<body>
SWITCH(x).TO(d, e, f);
</body>
</chain>
其中<route>
标签里的就是决策EL,决策EL里只能用与或非表达式,所配置的组件只能是布尔组件。
而<body>
里的内容就是原先的规则EL。
# 执行方法
LiteFlow在FlowExecutor
里新提供了一系列的方法用于执行带决策路由的规则,最基本的方法:
List<LiteflowResponse> responseList = flowExecutor.executeRouteChain(requestData, YourContext.class);
可以发现,executeRouteChain
其实和execute2Resp
差不多,当然execute2Resp
支持的,executeRouteChain
都支持。比如用初始化好的上下文传入,多上下文的传入。其实和原先都一样,只是不用再传chainId了而已。
当传入之后,LiteFlow会去并行的判断决策路由,符合决策的规则也会被并行的进行执行。
如果你的规则里并没有带有决策路由的规则,又或者是匹配决策路由后,没有可用的规则,LiteFlow会报错进行提示。
值得一说的是方法的返回,返回是一个List<LiteflowResponse>
,List里面的就是每一个匹配到的规则执行之后生成的response,在LiteflowResponse
中新增了chainId字段,用来识别是哪条规则的结果。
# 执行指定namespace的决策路由v2.12.1+
决策路由默认会去执行所有带<route>
标签的chain。
但是如果你的决策路由很多,想要判断某一组决策路由,这时候可以可以在chain层面加入namespace参数,比如:
<chain name="chain1" namespace="n1">
<route>
AND(r1, r2, r3)
</route>
<body>
THEN(a, b, c);
</body>
</chain>
<chain name="chain2" namespace="n1">
<route>
AND(OR(r4, r5), NOT(r3))
</route>
<body>
SWITCH(x).TO(d, e, f);
</body>
</chain>
<chain name="chain3" namespace="n2">
<route>
r4
</route>
<body>
WHEN(a,b);
</body>
</chain>
<chain name="chain4" namespace="n2">
<route>
AND(r4,r5)
</route>
<body>
IF(x, m, n);
</body>
</chain>
FlowExecutor
也提供了一个带指定namespace的执行方法:
List<LiteflowResponse> responseList = flowExecutor.executeRouteChain("n1", requestData, YourContext.class);
以上例子只会在n1这个namespace中去进行判断,会依次判断chain1和chain2满不满足决策条件,然后选择满足决策的规则进行执行。
# 决策路由对数据库的支持
目前决策路由特性仅对xml文件形式以及数据库方式进行了支持。其他存储均不支持这一特性。
数据库方式的配置请参考SQL数据库配置源。
# 要注意的点
1.决策路由体里的节点不能是除了布尔组件
之外的任何类型的组件。
2.决策路由体里的表达式不能是除了与或非表达式
之外任何其他的主表达式。
3.匹配到的每一个规则的上下文实例都是单独的,并且运行时是并行执行的。互不相干。
4.启动不检查规则特性对决策路由EL是不起作用的,决策体中的EL是启动时一定会检查的,但是决策体中的EL是可以加node
关键字的。
5.决策路由体中的EL是可以加tag
,data
等副表达式的。
6.在JSON和YAML等格式中,也是可以加决策体的,多了一个route
的key值,但是没有body
,因为在json和yaml中,原先的规则体的key是value
,还是会保留的。