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

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,用于控制是否启用该规则链。
  1. Script 表配置(可选)
  • 如果你的应用使用脚本来增强规则链的功能,可以配置这些选项:
  • scriptTableName : 脚本表名,这里是 sys_rule_script。
  • scriptIdField, scriptNameField, scriptDataField, scriptTypeField, scriptLanguageField, scriptEnableField `: 分别指定了脚本 ID、名称、数据(内容)、类型、语言和启用状态的字段名。
    1. 轮询机制
  • pollingEnabled : 设置为 true 表示启用了轮询机制,LiteFlow 将定期检查是否有新的或更新的规则需要加载。
  • pollingStartSeconds : 定义首次轮询开始的时间点,设置为 0 意味着服务启动后立即开始第一次轮询。
  • pollingIntervalSeconds: 定义两次轮询之间的间隔时间,这里是每5秒一次。
    1. 解析模式 (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/ 简要 如果你要对复杂业务逻辑进行新写或者重构&#xff0c;用LiteFlow最合适不过。…...

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)

阻抗&#xff08;Impedance&#xff09;、容抗&#xff08;Capacitive Reactance&#xff09;、感抗&#xff08;Inductive Reactance&#xff09; 都是交流电路中描述电流和电压之间关系的参数&#xff0c;但它们的含义、单位和作用不同。下面是它们的定义和区别&#xff1a; …...

旷视科技Java面试题及参考答案

讲一下进程间的通讯方式(如管道、消息队列、共享内存、Socket 等),各有什么特点? 管道(Pipe) 管道是最早出现的进程间通信方式之一,主要用于具有亲缘关系(父子进程)的进程之间通信。 特点: 半双工通信,数据只能单向流动。例如,在一个简单的父子进程通信场景中,父进…...

reactor的Hooks.enableAutomaticContextPropagation();不生效解决方案

1. pom中需要先增加如下的内容 <dependency><groupId>io.micrometer</groupId><artifactId>context-propagation</artifactId><version>1.1.2</version> </dependency> 2. 注意&#xff0c;要看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程序&#xff1a; 2.头文件&#xff1a; 3.cin和cout初识&#xff1a; 4.命名空间&#xff1a; 二.顺序表和vector&#xff08;STL&#xff09; 1.顺序表的基本操作&#xff1a; 2.封装静态顺序表&#xff1a; 3.动态顺序表--vector&#xff1a;…...

【LLM】概念解析 - Tensorflow/Transformer/PyTorch

背景 本文将从算法原理、适用范围、强项、知名大模型的应用、python 调用几个方面&#xff0c;对深度学习框架 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

背景介绍&#xff1a; meld是一款Linux系统下的用于 文件夹和文件的比对软件&#xff0c;非常常用&#xff1b; 故障现象&#xff1a; 输入安装命令后&#xff0c;sudo yum install meld&#xff0c;报错。 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&#xff08;不安全验证&#xff09;漏洞指的是在实现 CAPTCHA&#xff08;完全自动化公共图灵测试区分计算机和人类&#xff0…...

JavaScript HTML DOM 实例

JavaScript HTML DOM 实例 JavaScript 的 HTML DOM(文档对象模型)允许您通过脚本来控制 HTML 页面。DOM 是 HTML 文档的编程接口,它将 Web 页面与编程语言连接起来,使得开发者可以改变页面中的内容、结构和样式。在这篇文章中,我们将通过一系列实例来探讨如何使用 JavaSc…...

软件架构和软件体系结构的关系

软件架构&#xff08;Software Architecture&#xff09;和软件体系结构&#xff08;Software System Architecture&#xff09;这两个术语在日常使用中经常被交替使用&#xff0c;但它们在严格意义上有所区别&#xff1a; 1. **软件架构**&#xff1a; - 软件架构主要关注软件…...

C++并发:在线程间共享数据

1 线程间共享数据的问题 1.1 条件竞争 条件竞争&#xff1a;在并发编程中&#xff1a;操作由两个或多个线程负责&#xff0c;它们争先让线程执行各自的操作&#xff0c;而结果取决于它们执行的相对次序&#xff0c;这样的情况就是条件竞争。 诱发恶性条件竞争的典型场景是&am…...

GaussDB逻辑解码技术原理深度解析

GaussDB逻辑解码技术原理深度解析 一、背景介绍 在数字化转型的大潮中&#xff0c;异构数据库之间的数据同步需求日益增长。异构数据库同步指的是将不同类型、不同结构的数据库之间的数据进行同步处理&#xff0c;以确保数据在不同数据库之间的一致性。华为云提供的DRS服务&a…...

JAVA构造方法练习

要求在Student类中&#xff0c;&#xff08;task1&#xff09;添加一个有name和ID两个参数的构造方法&#xff0c;对成员变量name和ID进行初始化&#xff0c;&#xff08;task2&#xff09;实例化一个Student对象&#xff0c;学生姓名&#xff1a;Yaoming&#xff0c;ID&#x…...

Pytorch 三小时极限入门教程

一、引言 在当今的人工智能领域&#xff0c;深度学习占据了举足轻重的地位。而 Pytorch 作为一款广受欢迎的深度学习框架&#xff0c;以其简洁、灵活的特性&#xff0c;吸引了大量开发者投身其中。无论是科研人员探索前沿的神经网络架构&#xff0c;还是工程师将深度学习技术落…...

Rockect基于Dledger的Broker主从同步原理

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; RocketMQ原理简述&#xff08;二&#xff09;-CSDN博客 2.Broker的高可用 如果…...

面向对象分析与设计Python版 面向对象的核心特征

文章目录 一、封装二、继承三、多态四、聚合/组合五、接口/实现六、抽象 一、封装 封装 Encapsulation 封装是隐藏对象实现细节的过程内部状态通常不能被其他对象访问对象的数据只能通过接口去访问封装使得对象可以被看成一个“黑盒子”它保护对象的内部状态不被其他对象破坏…...

CDP集群安全指南-静态数据加密

[一]静态数据加密的架构 CDP 支持两种加密组件&#xff0c;这些组件可以组合成独特的解决方案。在选择密钥管理系统&#xff08;KMS&#xff09;时&#xff0c;您需要决定哪些组件能够满足企业的密钥管理和加密需求。 CDP 加密组件 以下是 Cloudera 用于静态数据加密的组件描…...

RSA密码的安全性分析(简化版本)

RSA的安全性是基于分解大整数的困难性假定&#xff0c;之所以认为是假定是因为至今还未能证明大整数就是NP问题&#xff0c;也许有尚未发现的多项式时间分解算法。随着人类计算能力的不断提高&#xff0c;原来被认为是不可能分解的大数已经被成功分解。对于大整数的威胁除了人类…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...