LiteFlow 流程引擎引入Spring boot项目集成pg数据库
文章目录
- 官网地址
- 简要
- 项目引入
- maven 所需jar包
- 配置 PostgreSQL 数据库表使用LiteFlow
- 配置 yml 文件
- 通过 代码方式使用 liteflow
- 数据库sql
- 数据在流程中周转
官网地址
https://liteflow.cc/
简要
如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。它是一个编排式的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。
利用LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow拥有开源规则引擎最为简单的DSL语法。十分钟就可上手。
LiteFlow的脚本组件,支持众多脚本语言,完全和Java打通,你可以用脚本来实现任何逻辑。

项目引入
maven 所需jar包
- liteflow-spring-boot-starter:
- 这是 LiteFlow 的核心依赖,它集成了 LiteFlow 与 Spring Boot 框架,使得你可以轻松地在 Spring Boot 项目中使用 LiteFlow 来进行流程管理。
- liteflow-rule-sql:
- 此模块提供了从 SQL 数据库加载规则的能力,使你可以将流程定义存储在数据库中,并根据需要动态加载它们。
- liteflow-script-groovy:
- 该依赖项允许你在 LiteFlow 中使用 Groovy 脚本语言来编写脚本节点。Groovy 是一种强大的动态语言,非常适合编写简短而灵活的脚本逻辑。
- liteflow-script-javax:
- 提供了使用 Java 编写的脚本节点支持,允许更深入地集成业务逻辑。
- liteflow-script-aviator:
- Aviator 是一个轻量级的表达式语言引擎,这个依赖允许你在 LiteFlow 中使用 Aviator 表达式来简化条件判断和其他逻辑操作。
<properties><liteflow.version>2.12.4.1</liteflow.version>
</properties>
<dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId></dependency><dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>${liteflow.version}</version></dependency><dependency><groupId>com.yomahub</groupId><artifactId>liteflow-rule-sql</artifactId><version>${liteflow.version}</version></dependency><dependency><groupId>com.yomahub</groupId><artifactId>liteflow-script-groovy</artifactId><version>${liteflow.version}</version></dependency><dependency><groupId>com.yomahub</groupId><artifactId>liteflow-script-javax</artifactId><version>${liteflow.version}</version></dependency><dependency><groupId>com.yomahub</groupId><artifactId>liteflow-script-aviator</artifactId><version>${liteflow.version}</version></dependency>
</dependencies>
配置 PostgreSQL 数据库表使用LiteFlow
配置 yml 文件
rule-source-ext-data-map
- 这部分定义了 LiteFlow 如何从外部数据源加载规则信息。具体来说:
applicationName: 应用名称,这里是 dataprocessing,它用于标识当前应用。chainTableName: 规则链表名,即 sys_rule_chain,LiteFlow 将从此表中读取规则链信息。- 字段映射:
chainApplicationNameField: 表示规则链所属的应用名称字段,这里为 application_name。chainNameField: 规则链名称字段,对应 chain_name。elDataField: 表达式数据字段,即 el_data,通常用于存储条件表达式或执行逻辑。routeField: 路由字段,表示 route。namespaceField: 命名空间字段,对应 namespace。chainEnableField: 启用状态字段,表示 enable,用于控制是否启用该规则链。
- Script 表配置(可选)
- 如果你的应用使用脚本来增强规则链的功能,可以配置这些选项:
scriptTableName: 脚本表名,这里是 sys_rule_script。- scriptIdField, scriptNameField, scriptDataField, scriptTypeField, scriptLanguageField, scriptEnableField `: 分别指定了脚本 ID、名称、数据(内容)、类型、语言和启用状态的字段名。
-
- 轮询机制
pollingEnabled: 设置为 true 表示启用了轮询机制,LiteFlow 将定期检查是否有新的或更新的规则需要加载。pollingStartSeconds: 定义首次轮询开始的时间点,设置为 0 意味着服务启动后立即开始第一次轮询。pollingIntervalSeconds: 定义两次轮询之间的间隔时间,这里是每5秒一次。-
- 解析模式 (parse-mode)
- parse_one_on_first_exec: 这个模式意味着当一个链首次被执行时,LiteFlow 会解析该链,并在后续执行中使用缓存的结果。只有当检测到有变更时(如通过轮询发现),才会重新解析。
liteflow:rule-source-ext-data-map:applicationName: demo#以下是chain表的配置,这个一定得有chainTableName: chainchainApplicationNameField: application_namechainNameField: chain_nameelDataField: el_datarouteField: routenamespaceField: namespacechainEnableField: enable#以下是script表的配置,如果你没使用到脚本,下面可以不配置scriptTableName: scriptscriptApplicationNameField: application_namescriptIdField: script_idscriptNameField: script_namescriptDataField: script_datascriptTypeField: script_typescriptLanguageField: languagescriptEnableField: enable#以下是轮询机制的配置pollingEnabled: truepollingStartSeconds: 0pollingIntervalSeconds: 5parse-mode: parse_one_on_first_exec
通过 代码方式使用 liteflow
@LiteflowComponent 是 LiteFlow 框架中的一个注解,用于标识一个类为 LiteFlow 组件。这个注解类似于 Spring 框架中的 @Component 注解,但它具有特定于 LiteFlow 的功能和用途。
a,b,c, d 代码实例
@LiteflowComponent("a")
public class ACmp extends NodeComponent {@Overridepublic void process() {System.out.println("ACmp executed!");}
}@LiteflowComponent("b")
public class BCmp extends NodeComponent {@Overridepublic void process() {System.out.println("BCmp executed!");}}
@LiteflowComponent("c")
public class CCmp extends NodeComponent {@Overridepublic void process() {System.out.println("CCmp executed!");}}@LiteflowComponent("d")
public class DCmp extends NodeComponent {@Overridepublic void process() {System.out.println("DCmp executed!");}}
数据库sql
create table chain
(id bigint auto_incrementprimary key,application_name varchar(32) null,chain_name varchar(32) null,chain_desc varchar(64) null,el_data text null,route text null,namespace varchar(32),create_time datetime null,enable tinyint(1) 1
);create table script
(id bigint auto_incrementprimary key,application_name varchar(32) null,script_id varchar(32) null,script_name varchar(64) null,script_data text null,script_type varchar(16) null,language varchar(32) null,enable tinyint(1) 1
);INSERT INTO chain (id, application_name, chain_name, chain_desc, el_data, route, namespace, create_time, enable) VALUES (1, 'demo', 'chain1', '测试流程', 'THEN(a,b,c,s1,s2,s3,s4);', null, null, '2022-09-19 19:31:00', 1);
INSERT INTO chain (id, application_name, chain_name, chain_desc, el_data, route, namespace, create_time, enable) VALUES (3, 'demo', 'r_chain1', '策略路由1', 'THEN(b,a,s1);', 'r1', 'ns', '2024-05-27 14:03:01', 1);
INSERT INTO chain (id, application_name, chain_name, chain_desc, el_data, route, namespace, create_time, enable) VALUES (4, 'demo', 'r_chain2', '策略路由2', 'THEN(a,b,s2);', 'OR(r1,r2)', 'ns', '2024-05-27 14:03:44', 1);INSERT INTO script (id, application_name, script_id, script_name, script_data, script_type, language, enable) VALUES (1, 'demo', 's1', '脚本s1', 'import cn.hutool.core.date.DateUtildef date = DateUtil.parse("2022-10-17 13:31:43")
println(date)
defaultContext.setData("demoDate", date)class Student {int studentIDString studentName
}Student student = new Student()
student.studentID = 100301
student.studentName = "张三"
defaultContext.setData("student",student)def a=3
def b=2
defaultContext.setData("s1",a*b)', 'script', 'groovy', 1);
INSERT INTO script (id, application_name, script_id, script_name, script_data, script_type, language, enable) VALUES (2, 'demo', 's2', '脚本s2', 'defaultContext.setData("s2","hello")', 'script', 'groovy', 1);
INSERT INTO script (id, application_name, script_id, script_name, script_data, script_type, language, enable) VALUES (3, 'demo', 's3', '脚本s3', 'setData(defaultContext, "s3", 5*6);', 'script', 'aviator', 1);
INSERT INTO script (id, application_name, script_id, script_name, script_data, script_type, language, enable) VALUES (4, 'demo', 's4', '脚本4', 'import cn.hutool.core.collection.ListUtil;import com.yomahub.liteflow.script.body.CommonScriptBody;import com.yomahub.liteflow.slot.DefaultContext;import com.yomahub.liteflow.spi.holder.ContextAwareHolder;import com.example.liteflow.mysql.vo.Person;import com.yomahub.liteflow.script.ScriptExecuteWrap;import java.util.List;import java.util.function.ToIntFunction;public class Demo implements CommonScriptBody {public Void body(ScriptExecuteWrap wrap) {DefaultContext ctx = wrap.getCmp().getFirstContextBean();List<Person> personList = ListUtil.toList(new Person("jack", 15000),new Person("tom", 23500),new Person("peter", 18500));int totalSalary = personList.stream().mapToInt(Person::getSalary).sum();System.out.println(totalSalary);ctx.setData("salary", totalSalary);return null;}}', 'script', 'java', 1);
数据在流程中周转
liteflow 是进行流程上下文的方式去 读取存储数据
我们在组件里面写业务,首先肯定就是要拿到上下文,在声明式组件里通常的写法为:
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS,nodeType = NodeTypeEnum.COMMON, nodeId = "b")
public void processB(NodeComponent bindCmp) {YourContext context = bindCmp.getContextBean(YourContext.class);//从context中取到业务数据进行处理User user = context.getUser();...
}
具体参考官网 https://liteflow.cc/pages/8777f8/
相关文章:
LiteFlow 流程引擎引入Spring boot项目集成pg数据库
文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。…...
阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)
阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance) 都是交流电路中描述电流和电压之间关系的参数,但它们的含义、单位和作用不同。下面是它们的定义和区别: …...
旷视科技Java面试题及参考答案
讲一下进程间的通讯方式(如管道、消息队列、共享内存、Socket 等),各有什么特点? 管道(Pipe) 管道是最早出现的进程间通信方式之一,主要用于具有亲缘关系(父子进程)的进程之间通信。 特点: 半双工通信,数据只能单向流动。例如,在一个简单的父子进程通信场景中,父进…...
reactor的Hooks.enableAutomaticContextPropagation();不生效解决方案
1. pom中需要先增加如下的内容 <dependency><groupId>io.micrometer</groupId><artifactId>context-propagation</artifactId><version>1.1.2</version> </dependency> 2. 注意,要看idea是否将context-propagati…...
DS复习提纲模版
数组的插入删除 int SeqList::list_insert(int i, int item) { //插入if (i < 1 || i > size 1 || size > maxsize) {return 0; // Invalid index or list is full}for (int j size-1; j > i-1; j--) { // Shift elements to the rightlist[j1] list[j];}li…...
蓝桥杯备赛:C++基础,顺序表和vector(STL)
目录 一.C基础 1.第一个C程序: 2.头文件: 3.cin和cout初识: 4.命名空间: 二.顺序表和vector(STL) 1.顺序表的基本操作: 2.封装静态顺序表: 3.动态顺序表--vector:…...
【LLM】概念解析 - Tensorflow/Transformer/PyTorch
背景 本文将从算法原理、适用范围、强项、知名大模型的应用、python 调用几个方面,对深度学习框架 TensorFlow、PyTorch 和基于深度学习的模型 Transformer 进行比较。主要作用是基础概念扫盲。 一、 算法原理对比 Transformer Transformer 是一种基于深度学习的…...
对一段已知行情用python中画出K线图~
1. 已知行情: 2024/09/05 ~ 2025/1/3 date open high low close 0 2024-09-05 2785.2635 2796.0186 2777.4710 2788.3141 1 2024-09-06 2791.7645 2804.0932 2765.6394 2765.8066 2 2024-09-09 2754.7237 2756.5560 2726.9667 2736.…...
Rocky Linux下安装meld
背景介绍: meld是一款Linux系统下的用于 文件夹和文件的比对软件,非常常用; 故障现象: 输入安装命令后,sudo yum install meld,报错。 12-31 22:12:17 ~]$ sudo yum install meld Last metadata expirat…...
DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计
目录 Insecure CAPTCHA(不安全验证)low源码审计 medium源码审计 high源码审计 impossible源码审计 Insecure CAPTCHA(不安全验证) Insecure CAPTCHA(不安全验证)漏洞指的是在实现 CAPTCHA(完全自动化公共图灵测试区分计算机和人类࿰…...
JavaScript HTML DOM 实例
JavaScript HTML DOM 实例 JavaScript 的 HTML DOM(文档对象模型)允许您通过脚本来控制 HTML 页面。DOM 是 HTML 文档的编程接口,它将 Web 页面与编程语言连接起来,使得开发者可以改变页面中的内容、结构和样式。在这篇文章中,我们将通过一系列实例来探讨如何使用 JavaSc…...
软件架构和软件体系结构的关系
软件架构(Software Architecture)和软件体系结构(Software System Architecture)这两个术语在日常使用中经常被交替使用,但它们在严格意义上有所区别: 1. **软件架构**: - 软件架构主要关注软件…...
C++并发:在线程间共享数据
1 线程间共享数据的问题 1.1 条件竞争 条件竞争:在并发编程中:操作由两个或多个线程负责,它们争先让线程执行各自的操作,而结果取决于它们执行的相对次序,这样的情况就是条件竞争。 诱发恶性条件竞争的典型场景是&am…...
GaussDB逻辑解码技术原理深度解析
GaussDB逻辑解码技术原理深度解析 一、背景介绍 在数字化转型的大潮中,异构数据库之间的数据同步需求日益增长。异构数据库同步指的是将不同类型、不同结构的数据库之间的数据进行同步处理,以确保数据在不同数据库之间的一致性。华为云提供的DRS服务&a…...
JAVA构造方法练习
要求在Student类中,(task1)添加一个有name和ID两个参数的构造方法,对成员变量name和ID进行初始化,(task2)实例化一个Student对象,学生姓名:Yaoming,ID&#x…...
Pytorch 三小时极限入门教程
一、引言 在当今的人工智能领域,深度学习占据了举足轻重的地位。而 Pytorch 作为一款广受欢迎的深度学习框架,以其简洁、灵活的特性,吸引了大量开发者投身其中。无论是科研人员探索前沿的神经网络架构,还是工程师将深度学习技术落…...
Rockect基于Dledger的Broker主从同步原理
1.前言 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写,有些不清楚的可以看下上一篇博客: RocketMQ原理简述(二)-CSDN博客 2.Broker的高可用 如果…...
面向对象分析与设计Python版 面向对象的核心特征
文章目录 一、封装二、继承三、多态四、聚合/组合五、接口/实现六、抽象 一、封装 封装 Encapsulation 封装是隐藏对象实现细节的过程内部状态通常不能被其他对象访问对象的数据只能通过接口去访问封装使得对象可以被看成一个“黑盒子”它保护对象的内部状态不被其他对象破坏…...
CDP集群安全指南-静态数据加密
[一]静态数据加密的架构 CDP 支持两种加密组件,这些组件可以组合成独特的解决方案。在选择密钥管理系统(KMS)时,您需要决定哪些组件能够满足企业的密钥管理和加密需求。 CDP 加密组件 以下是 Cloudera 用于静态数据加密的组件描…...
RSA密码的安全性分析(简化版本)
RSA的安全性是基于分解大整数的困难性假定,之所以认为是假定是因为至今还未能证明大整数就是NP问题,也许有尚未发现的多项式时间分解算法。随着人类计算能力的不断提高,原来被认为是不可能分解的大数已经被成功分解。对于大整数的威胁除了人类…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
