liteflow
maven依赖
https://mvnrepository.com/artifact/com.yomahub
artifact-Id 为 liteflow-* 的依赖
基础依赖
liteflow-core 基础依赖。文档:https://liteflow.cc/pages/8760c4/
liteflow-spring spring支持。文档:https://liteflow.cc/pages/0a4573/
liteflow-spring-boot-starter spring-boot支持。文档:https://liteflow.cc/pages/df6982/
liteflow-solon-plugin 使用solon框架用户。文档:https://liteflow.cc/pages/3df00c/
规则配置源(liteflow-rule-*)
liteflow-rule-sql 使用数据库作为规则配置源。文档:https://liteflow.cc/pages/236b4f/
liteflow-rule-zk 使用zk集群作为规则配置源。文档:https://liteflow.cc/pages/ffc345/
liteflow-rule-nacos 使用Nacos作为规则配置源。文档:https://liteflow.cc/pages/09b776/
liteflow-rule-etcd 使用Etcd作为规则配置源。文档:https://liteflow.cc/pages/4bfac2/
liteflow-rule-apollo 使用Apollo作为规则配置源。文档:https://liteflow.cc/pages/bea809/
liteflow-rule-redis 使用Redis作为规则配置源。文档:https://liteflow.cc/pages/38dcf8/
脚本语言(liteflow-script-*)
liteflow-script-javax java脚本语言。文档:https://liteflow.cc/pages/2b8afb/
liteflow-script-groovy groovy脚本语言。文档:https://liteflow.cc/pages/36877b/
liteflow-script-javascript javascript脚本语言。文档:https://liteflow.cc/pages/07f433/
liteflow-script-qlexpress qlexpress脚本语言。文档:https://liteflow.cc/pages/19db6d/
liteflow-script-python python脚本语言。文档:https://liteflow.cc/pages/114982/
liteflow-script-lua lua脚本语言。文档:https://liteflow.cc/pages/5f0cc7/
liteflow-script-aviator aviator脚本语言。文档:https://liteflow.cc/pages/bad4b0/
liteflow-script-kotlin kotlin脚本语言。文档:https://liteflow.cc/pages/7c44ca/
常用组件
普通组件(NodeComponent)
可用关键字:THEN、WHEN
文档:https://liteflow.cc/pages/8486fb/
选择组件(NodeSwitchComponent)
可用关键字: SWITCH
文档:https://liteflow.cc/pages/c0f5d7/
布尔组件(NodeBooleanComponent)
可用关键字: IF...ELIF...ELSE 、 WHILE...DO... 、 FOR...DO...BREAK 、 WHILE...DO...BREAK 、 ITERATOR...DO...BREAK
文档:https://liteflow.cc/pages/cb0b59/
次数循环组件(NodeForComponent)
可用关键字: FOR...DO...
文档:https://liteflow.cc/pages/5f971f/
迭代循环组件(NodeIteratorComponent)
可用关键字: ITERATOR...DO...
文档:https://liteflow.cc/pages/64262b/
关键字
THEN
依次执行组件。文档:https://liteflow.cc/pages/a590ee/
THEN(a, b, c); 依次执行a、b、c组件
SER
依次执行组件。文档:https://liteflow.cc/pages/a590ee/
SER(a, b, c); 依次执行a、b、c组件
WHEN
并行执行组件。文档:https://liteflow.cc/pages/b3446a/
WHEN(a, b, c) 同时执行a、b、c组件
WHEN(a, b, c).ignoreError(true) 同时执行a、b、c组件,并忽略异常
WHEN(a, b, c).any(true) 同时执行a、b、c组件,任一组件先执行完即终止其他未完成组件
WHEN(a, b, c).must(a,b) 同时执行a、b、c组件,且a、b组件必须执行,当a、b组件都执行完后c还没执行完则终止执行
SWITCH
选择执行组件。文档:https://liteflow.cc/pages/d90483/
SWITCH(s).to(a, b, c); 根据a组件选择执行b、c、d组件其中的一个。
SWITCH(s).TO(a, b, c).DEFAULT(y); 根据a组件选择执行b、c、d组件其中的一个,并设置默认y组件。
IF
按条件执行组件。文档:https://liteflow.cc/pages/e76999/
IF(i, a) 组件i 返回 true 时执行 组件a
IF(i, a).ELSE(b); 组件i 返回 true 时执行 组件a,否则执行 组件b。
IF(i, a, b) 组件i 返回 true 时执行 组件a,返回false时执行 组件b。
IF(i1, a).ELIF(i2, b).ELSE(c); 组件i1 返回 true 时执行 组件a,组件i2 返回 true 时执行 组件b,否则执行 组件c。
FOR
for循环。文档:https://liteflow.cc/pages/fbf715/
FOR(5).DO(a); 循环执行5次 组件a。循环次数可通过for循环组件提供。
FOR(5).parallel(true).DO(a); 并行执行5次 组件a
WHILE
while循环。文档:https://liteflow.cc/pages/fbf715/
WHILE(i).DO(a); 布尔组件i 返回true 时执行 组件a,当 布尔组件i 返回false时跳出循环。
WHILE(i).parallel(true).DO(a); 并行执行 组件a
ITERATOR
迭代器循环。文档:https://liteflow.cc/pages/fbf715/
ITERATOR(iter).DO(a); 通过 迭代器组件iter 循环 组件a
ITERATOR(iter).parallel(true).DO(a); 并行执行 组件a
BREAK
退出循环。文档:https://liteflow.cc/pages/fbf715/
FOR(f).DO(a).BREAK(i); 布尔组件返回true退出循环
WHILE(w).DO(a).BREAK(i); 布尔组件返回true退出循环
CATCH
捕获异常。文档:https://liteflow.cc/pages/fbf715/
CATCH(a).DO(b) a组件 抛出异常 则执行 b组件
CATCH(a) a组件 抛出异常 不做任何处理
AND
布尔组件的与逻辑。文档:https://liteflow.cc/pages/a8b344/
AND(a,b) a、b组件都为true时为true
OR
布尔组件的或逻辑。文档:https://liteflow.cc/pages/a8b344/
OR(a,b) a、b组件有一个为true时为true
NOT
布尔组件的非逻辑。文档:https://liteflow.cc/pages/a8b344/
NOT(a) a组件为true时为false
PRE
前置节点,只能用在 THEN 内,位置不限。文档:https://liteflow.cc/pages/9f93be/
THEN(a,PRE(b, c),d); 先依次执行b、c组件,再依次执行a、d组件。
FINALLY
后置节点,只能用在 THEN 内,位置不限。文档:https://liteflow.cc/pages/9f93be/
FINALLY(a,PRE(b, c),d); 先依次执行a、d组件,再依次执行b、c组件。
嵌套语法
当 s组件 返回 a 时执行 a组件,当 s组件 返回 t1 时执行 THEN(b, c) 分支,
SWITCH(s).to(a, THEN(b, c).id("t1"))
当 s组件 返回 a 时执行 a组件,当 s组件 返回 tag:t1 或 :t1 时执行 THEN(b, c) 分支,
SWITCH(s).to(a, THEN(b, c).tag("t1"))
子流程,先同时执行 a、b组件,再同时执行c、d组件。
<chain name="mainChain">THEN(chain1,chain2);</chain><chain name="chain1">WHEN(a, b);</chain><chain name="chain2">WHEN(c, d);</chain>
flow.xml 基础格式
<?xml version="1.0" encoding="UTF-8"?>
<flow><nodes><node id="a" class="com.example.demo1.component.ACmp"/><node id="b" class="com.example.demo1.component.BCmp"/></nodes><chain name="mainChain">THEN(a,b);</chain>
</flow>
java 加载xml及执行
LiteflowConfig config = new LiteflowConfig();config.setRuleSource("config/flow.xml");FlowExecutor flowExecutor = FlowExecutorHolder.loadInstance(config);LiteflowResponse response = flowExecutor.execute2Resp("mainChain", "arg", DefaultContext.class);System.out.println(response);
参数
tag
配置数据
THEN(a.tag("1"));
获取数据
String tag = this.getTag();
data
配置数据
cmpData = '{"name":"jack","age":27,"birth":"1995-10-01"}';THEN(a.data(cmpData));
获取数据
Entity cmpData = this.getCmpData(Entity.class);
bind
配置数据
THEN(a.bind("k1", "testValue"), b);// 绑定动态数据,绑定的数据为 调用流程时 添加的 上下文对象 属性。THEN(a.bind("k1", "${orderCode}"), b);
获取数据
String bindValue = this.getBindData("k1", String.class);
其他语法
重试语法
使用 retry关键字 可以作用于组件上、子流程上、任意表达式上、表达式变量上等
THEN(a, b.retry(3)); b组件 发生异常时 自动 重试 3 次。
THEN(a, b).retry(3, "java.lang.NullPointerException"); 绑定指定异常重试,可指定多个异常。
超时语法
使用 maxWaitSeconds和maxWaitMilliseconds关键字对任意的组件、表达式、流程进行超时控制。
THEN(a,b).maxWaitSeconds(5); 指定流程超时时间
WHEN(a.maxWaitSeconds(2)); 指定组件超时时间
链路继承
可以在某个chain中使用extends属性来指明该chain继承自哪个chain。在被继承的chain中,需要预留出一个或多个占位符,以便于子chain可以对其进行扩展;而在子chain中,需要对被继承的父chain中的所有占位符进行实现。
<chain id="base">THEN(a, b, {{0}}, {{1}});
</chain>
<chain id="implA" extends="base">{{0}}=IF(c, d, e);{{1}}=SWITCH(f).to(j,k);
</chain>
等同于如下:
<chain id="implA">THEN(a, b, IF(c, d, e), SWITCH(f).to(j,k));
</chain>
验证规则
boolean isValid = LiteFlowChainELBuilder.validate("THEN(a, b, h)");
ValidationResp resp = LiteFlowChainELBuilder.validateWithEx("THEN(a, b, h)");
if (!resp.isSuccess()){log.error(resp.getCause());
}
数据上下文
配置上下文数据对象
LiteflowResponse response = flowExecutor.execute2Resp("chain1", 流程初始参数, OrderContext.class, UserContext.class, SignContext.class);
获取上下文数据对象
OrderContext orderContext = this.getContextBean(OrderContext.class);
UserContext userContext = this.getContextBean(UserContext.class);
SignContext signContext = this.getContextBean(SignContext.class);
//用表达式获取参数,省略Context获取匹配到的第一个
String userCode = this.getContextValue("userCode");
String userCode = this.getContextValue("userContext.userCode");
//假设userList是一个List属性,可以按照下标去取
String a = this.getContextValue("userList.get(0)");
//假设dataMap是一个Map属性
String b = this.getContextValue("dataMap.get('key')");
//假设nameArray是一个数组
String c = this.getContextValue("nameArray[0]");
//用表达式设置参数
this.setContextValue("setDesc", "hello" );
流程入参
//第二个参数为流程入参,可以是任何对象
public LiteflowResponse execute2Resp(String chainId, Object param, Class<?>... contextBeanClazzArray)
//获取流程入参
Bean requestBean = this.getRequestData();