记录一次LiteFlow项目实战

文章目录

  • 学习LiteFlow
  • spring boot整合LiteFlow
    • 依赖
    • 配置
      • 组件定义
      • spring boot配置文件
      • 规则文件的定义
    • 执行
  • 组件
  • EL规则
    • 串行
    • 并行
  • 动态构建组件
  • 动态构建chain(流程)
  • 销毁chain
  • 高级特性

题外话:
最近喜欢上骑摩托车了,不是多大排量的摩托车,小排量踏板,当骑车的时候真的可以获得快乐抛却烦恼,八九十的速度也是可以到的,但是还是要管住右手,慢慢骑。希望以后可以换个自己喜欢的巡航,骑帅不骑快。
背景:
最近在做大数据平台,数据治理相关,大数据量数据的清洗、转换、补全、融合等操作处理,最开始的设计的是不同数据任务,但是这样的话就比较固化,可拓展性不强。基于对数据平台的产品化考虑,决定将数据的流式任务处理具象成流程化处理。
在码云及git上面看了些开源项目,研究了一下,感觉使用场景匹配度不是太高,并且代码及功能有些重,决定还是使用LiteFlow自己开发相应的流程组件,最终实现数据流程任务的可编排。

学习LiteFlow

具体可以查看下官方文档:LiteFlow官方文档,该说不说这个文档实在是太全面了,讲解也比较详细。
从HelloWorld到安装运行,从规则文件到各种组件,然后是数据上下文、动态构造及各种高级特性,接下来简单说一下一般场景下使用到的重要功能点:

spring boot整合LiteFlow

依赖

LiteFlow提供了liteflow-spring-boot-starter依赖包,提供自动装配功能:

<dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>2.11.0</version>
</dependency>

配置

组件定义

在依赖了以上jar包后,你需要定义并实现一些组件,确保SpringBoot会扫描到这些组件并注册进上下文。

@Component("a")
public class ACmp extends NodeComponent {@Overridepublic void process() {//do your business}
}

以此类推再分别定义b,c组件:

@Component("b")
public class BCmp extends NodeComponent {@Overridepublic void process() {//do your business}
}
@Component("c")
public class CCmp extends NodeComponent {@Overridepublic void process() {//do your business}
}

spring boot配置文件

然后,在你的SpringBoot的application.properties或者application.yml里添加配置(这里以properties为例,yml也是一样的)

liteflow.rule-source=config/flow.el.xml

规则文件的定义

同时,你得在resources下的config/flow.el.xml中定义规则,SpringBoot在启动时会自动装载规则文件。

<?xml version="1.0" encoding="UTF-8"?>
<flow><chain name="chain1">THEN(a, b, c);</chain>
</flow>

执行

可以在Springboot任意被Spring托管的类中拿到flowExecutor,进行执行链路:

@Component
public class YourClass{@Resourceprivate FlowExecutor flowExecutor;public void testConfig(){LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");}
}

组件

包括:普通组件、选择组件、条件组件、次数循环组件、条件循环组件、迭代循环组件及退出循环组件。
以普通组件为例:
普通组件节点需要继承NodeComponent,可用于THEN和WHEN关键字中。需要实现process方法:

@LiteflowComponent("a")
public class ACmp extends NodeComponent {@Overridepublic void process() {System.out.println("ACmp executed!");}
}

@LiteflowComponent继承自@Component,如果你在spring体系的环境里,组件里可以任意注入spring的bean进行使用。@LiteflowComponent的参数a,就是你在写EL规则时需要用到组件ID。

组件中会有需要可以覆盖重写的方法, 具体就不罗列了,可以看下liteflow官方文档。

EL规则

LiteFlow在2.8.X版本中设计了非常强大的规则表达式。一切复杂的流程在LiteFlow表达式的加持下,都异常丝滑简便。
你只需要很短的时间即可学会如何写一个很复杂流程的表达式。简单列举下串行及并行的EL规则表达式写法:

串行

关键字:THEN,必须大写

<chain name="chain1">THEN(a, b, c, d);
</chain>
<chain name="chain1">THEN(a, b, c, d);
</chain>

上面两种写法是等价的。

并行

关键字:WHEN,必须大写。

<chain name="chain1">WHEN(a, b, c);
</chain>

可以串行。并行组合:

<chain name="chain1">THEN(a,WHEN(b, c, d),e);
</chain>

在这里插入图片描述

动态构建组件

一般业务场景其实并不会是固定的流程,而是动态的,后端搭配前端完成流程编排,像上面一样固定的组件其实实际使用场景较少,适用于固定流程的。但是如果流程不固定的话,就需要用到动态构建组件了。
贴一下官方代码吧:

//构建一个普通组件
LiteFlowNodeBuilder.createCommonNode().setId("a").setName("组件A").setClazz("com.yomahub.liteflow.test.builder.cmp.ACmp").build();//构建一个普通条件组件
LiteFlowNodeBuilder.createSwitchNode().setId("a").setName("组件A").setClazz("com.yomahub.liteflow.test.builder.cmp.ACmp").build();

动态构建普通组件,首先要定义好ACmp类,通过LiteFlowNodeBuilder.createCommonNode()方法链式构建组件,其中setId、setName、setClazz都是可以动态指定的。

这里的节点类(ACmp),不需要你去声明@LiteflowComponent或者@Component,如果项目是spring体系的话,LiteFlow框架会自动的把节点类注入到spring上下文中。
所以你仍旧可以在这个类(ACmp)里使用@Autowired和@Resource等等之类的spring任何注解,也就是说可以正常使用业务service。

贴一个ACmp代码吧:

/*** @Description demo* @Author: phli* @CreateTime: 2023/9/13 17:05*/
public class ACmp extends NodeComponent {@Resourceprivate RestTemplate restTemplate;@Overridepublic void process() throws Exception {//自己的业务代码Object object = restTemplate.postForObject("", null, Object.class);}@Overridepublic void onSuccess() throws Exception {super.onSuccess();}@Overridepublic void onError(Exception e) throws Exception {super.onError(e);}
}

简单说一下:process就是该组件的执行逻辑方法,onSuccess方法即为流程的成功事件回调,onError就是流程的失败事件回调。一些组件中会用到的内置方法(我用到的):

  • 获取组件id:getNodeId;
  • 获取组件别名;getName;
  • 获取流程的初始参数:getChainName;
  • 获取流程的初始参数:getRequestData;

动态构建chain(流程)

上面讲过我们可以再规则配置文件中,会通过:

flowExecutor.execute2Resp("chain1", "arg");//chain1
<?xml version="1.0" encoding="UTF-8"?>
<flow><chain name="chain1">THEN(a, b, c);</chain>
</flow>

执行chainName为”chain1“的流程。上面说过这种方式都比较死板,基本没有拓展性,我们还可以通过代码来构建chain:

LiteFlowChainELBuilder.createChain().setChainId("chainA").setChainName("chain2").setEL("THEN(a, b, WHEN(c, d))"
).build();

构建chain的前提是先要构建组件,不然流程创建会出错,提示找不到组件。chainId、chainName及EL都可以动态指定。

值得提一下的是,由于用构造模式是一个链路一个链路的添加,如果你用了子流程,如果chain1依赖chain2,那么chain2要先构建。否则会报错。

销毁chain

可以通过以下代码销毁chain:

FlowBus.removeChain("你的流程ID")

高级特性

包括但不限于:前后置组件、组件回滚、组件切面、异步线程池、组件监控、替补组件、组件重试等等。具体就不展开说了,可以看下官方文档,真的很全:
在这里插入图片描述

整个流程节点如果多的话,执行比较慢可以将放到异步逻辑里面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132074.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年09月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

PostgreSQL 数据类型

文章目录 PostgreSQL数据类型说明PostgreSQL数据类型使用单引号和双引号数据类型转换布尔类型数值类型整型浮点型序列数值的常见操作 字符串类型日期类型枚举类型IP类型JSON&JSONB类型复合类型数组类型 PostgreSQL数据类型说明 PGSQL支持的类型特别丰富&#xff0c;大多数…

无涯教程-JavaScript - ISREF函数

描述 如果指定的值是参考,则ISREF函数返回逻辑值TRUE。否则返回FALSE。 语法 ISREF (value) 争论 Argument描述Required/OptionalvalueA reference to a cell.Required Notes 您可以在执行任何操作之前使用此功能测试单元格的内容。 适用性 Excel 2007,Excel 2010,Exce…

算法——快乐数

202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 由图可知&#xff0c;其实这也是一个判断循环的过程&#xff0c;要用到快慢指针&#xff0c;且相遇后&#xff0c;若在全为1的循环里&#xff0c;那么就是快乐数&#xff0c;若相遇后不为1&#xff0c;说明这不是快乐数。 …

反常积分的概念与计算

目录 无穷区间上的反常积分 无界函数的反常积分 反常积分的敛散性 反常积分的计算 无穷区间上的反常积分 无穷区间上的反常积分(improper integral on infinite interval)是一种反常积分 设函数f(x)在(a,∞)上有定义&#xff0c;且f(x)在任意有限区间(a,A)(A>a)上可积&…

AI项目五:结印动作识别

若该文为原创文章&#xff0c;转载请注明原文出处。 感谢恩培大佬对项目进行了完整的实现&#xff0c;并将代码进行开源&#xff0c;供大家交流学习。 恩培大佬开源地址&#xff0c;有兴趣的可以去复现一下。GitHub - enpeizhao/CVprojects: computer vision projects | 计算机…

Android Glide in RecyclerView,only load visible item when page return,Kotlin

Android Glide in RecyclerView&#xff0c;only load visible item when page return&#xff0c;Kotlin base on this article&#xff1a; Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片&#xff0c;Kotlin_zhangphil的博客…

使用大型语言模型的指南: 提高效率及安全性的技巧和策略 | 开源日报 0913

brexhq/prompt-engineering Stars: 5.8k License: MIT Prompt Engineering Guide&#xff0c;提供了与大型语言模型&#xff08;LLM&#xff09;相关的技巧和窍门。该指南基于Brex公司在生产用例中研究和创建LLM提示时所学到的经验教训&#xff0c;并涵盖了有关使用和构建程序…

【Java从入门到精通】这也许就是Java火热的原因吧!

前言&#xff1a;Java是一种高级的、面向对象的、可跨平台的程序设计语言。Java根据技术类别可划分为以下几类&#xff1a;JavaSE&#xff08;Standard Edition&#xff0c;标准版&#xff09;&#xff1a;支持面向桌面、嵌入式和移动设备的应用程序开发&#xff1b;JavaEE&…

机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

&#x1f308;&#x1f308;&#x1f308;机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 3、不同软间隔C值 3.1 数据标准化的影响 如图左边是没…

目录操作函数

1.mkdir #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); 作用&#xff1a;创建一个目录 参数&#xff1a; -pathname:创建的目录的路径 -mode:权限&#xff0c;八进制的数 返回值&#xff1a; 成功返回0&#xff…

activemq学习笔记

传统的request/response 在客户端提交请求后必须等待服务端处理完毕给于反馈&#xff0c;这期间客户端完全处于空闲等待状态&#xff0c;甚至有可能超时&#xff1b; 基于消息中间件的request/response 客户端提交请求&#xff0c;不必等待服务器处理&#xff0c;客户端可以继…

Re-Learn Linux Part1

1. Linux的目录结构 在Linux文件系统中有两个特殊的目录&#xff1a; 一个用户所在的工作目录&#xff0c;也叫当前目录&#xff0c;可以使用一个点 . 来表示&#xff1b;另一个是当前目录的上一级目录&#xff0c;也叫父目录&#xff0c;可以使用两个点 .. 来表示。 . &#…

Kubernetes网络插件Canal的工作原理和关键功能

文章目录 什么是 Canal&#xff1f;安装 Canal配置网络策略使用 Canal 进行跨节点通信总结 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内容&#xff1a;网…

Direct3D光照

光照的组成 环境光&#xff1a;这种类型的光经其他表面反射到达物体表面&#xff0c;并照亮整个场景&#xff0c;要想以较低代价粗略模拟这类反射光&#xff0c;环境光是一个很好的选择 漫射光&#xff1a;这种类型光沿着特定的方向传播。当它到达某一表面时&#xff0c;将沿…

Python 内置函数详解 (2) 逻辑运算

近期在外旅游,本篇是出发编辑的,准备定时发布用,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客https://blog.csdn.net/boysoft2002/article/detai…

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程 一、群晖套件中下载Cloud Sync 二、同步到百度云盘 打开Cloud Sync&#xff0c;点击左上角的号&#xff0c;云供应商选择百度云。 这里可以选择双向备份&#xff0c;也可以只上穿到百度云的仅上传本地更改。因为百…

服务器中了勒索病毒怎么办?勒索病毒解密,数据恢复

勒索病毒是一种比较常见的电脑病毒&#xff0c;它们给企业的生产经营和发展带来了很大的影响。可是绝大多数企业在这方面并没有做合理的预案&#xff0c;这也导致当安全运维人员或者企业主发现中了勒索病毒以后手足无措。那云天数据恢复中心就用这篇文章来告诉大家当服务器中了…

联通数科赋能中国联通DCMM5级评估!

近日&#xff0c;中国电子信息行业联合会发布了“关于公布获得数据管理能力成熟度等级证书单位的通知”&#xff0c;中国联通获得最高等级优化级&#xff08;5级&#xff09;&#xff0c;成为通信行业率先获得最高等级的单位&#xff0c;标志着中国联通数据管理能力进入国家第一…

MyBatis基础之概念简介

文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发&#xff0c;MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…