当前位置: 首页 > ops >正文

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();    
http://www.xdnf.cn/news/17760.html

相关文章:

  • Vue3中的ref与reactive全面解析:如何正确选择响应式声明方式
  • Java List 集合详解(ArrayList、LinkedList、Vector)
  • 水印消失术!JavaAI深度学习去水印技术深度剖析
  • 传输层协议TCP(3)
  • Flink Stream API 源码走读 - socketTextStream
  • 集成电路学习:什么是Machine Learning机器学习
  • 从单机到分布式:用飞算JavaAI构建可扩展的TCP多人聊天系统
  • 【力扣56】合并区间
  • easyexcel模板导出Map数据时空值列被下一行列非空数据覆盖
  • 从零开始的云计算生活——第四十三天,激流勇进,kubernetes模块之Pod资源对象
  • 使用Docker和Miniconda3搭建YOLOv13开发环境
  • 深入解析 Spring IOC 容器在 Web 环境中的启动机制
  • 小知识:for of,for in与forEach
  • Spark Shuffle机制原理
  • 图论(5)最小生成树算法
  • 计算机视觉Open-CV
  • OpenCV图像处理2:边界填充与平滑滤波实战
  • 23.Linux : ftp服务及配置详解
  • C语言指针使用
  • Python网络爬虫(二) - 解析静态网页
  • 【ai写代码】lua-判断表是否被修改
  • 分布式事务、锁、链路追踪
  • 地测管理部绩效考核关键指标与地质数据分析
  • 嵌入式 - Linux软件编程:进程
  • C01:内存操作函数
  • Origin绘制正态分布直方图+累积概率图|科研论文图表教程(附数据格式模板)
  • 可信搜索中的多重签名
  • mysql——count(*)、count(1)和count(字段)谁更快?有什么区别?
  • QLab Pro for Mac —— 专业现场音频与多媒体控制软件
  • Unity Shader unity文档学习笔记(十九):粘土效果,任意网格转化成一个球(顶点动画,曲面着色器)