Springcloud:LiteFlow

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、LiteFlow简介

二、规则编排关键字及语法

1、THEN:

2、WHEN:

3、AND:

4、OR:

5、IF:

6、ELSE:

7、RETRY:

8、RETRY_FOR_EACH:

9、RETRY_WHILE:

10、RETRY_UNTIL:

三、Springcloud接入LiteFlow例子

1、定义节点nodeA、nodeB

2、定义配置文件

3、配置文件配置

4、编写测试类

四、跳出节点的方式

1、抛异常

五、规则编排适合使用的场景

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、LiteFlow简介

在日常的开发过程中,经常会遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。

在这样的场景下,使用策略和模板模式的结合可以很好的解决这个问题,但是使用编码的方式会使得文件太多,在业务的部分环节可以这样操作,在项目角度就无法一眼洞穿其中的环节和逻辑。

在本文中,将引入规则引擎从全局角度来解决这个问题,这就是今天要介绍的主角 liteflow。

liteflow 是一个轻巧而且强大的规则引擎,能够实现开箱即用,可以在短时间内就可以完成复杂的规则编排,下图是 liteflow 的整体架构。liteflow 支持较多的规则文件格式,比如 xml/json/yaml, 对于规则文件的存储方式可以有sql/zk/nacos/apollo 等。

官网地址:LiteFlow

二、规则编排关键字及语法

1、THEN:

用于定义流程链中的节点顺序。节点按照THEN关键字后面的顺序执行

<chain name="chain1">

THEN(nodeA, nodeB, nodeC)

</chain>

2、WHEN:

用于定义条件节点。WHEN关键字后面的节点只有在满足条件时才会执行

<chain name="chain1">

WHEN(conditionNode)

THEN(nodeA, nodeB)

</chain>

3、AND:

用于并行执行多个节点。AND关键字后面的节点会同时执行

<chain name="chain1">

AND(nodeA, nodeB)

</chain>

4、OR:

用于定义多个节点中的任意一个执行。OR关键字后面的节点会按照顺序执行,直到找到一个成功执行的节点

<chain name="chain1">

OR(nodeA, nodeB)

</chain>

5、IF:

用于条件判断。IF关键字后面的节点只有在满足条件时才会执行

<chain name="chain1">

IF(conditionNode)

THEN(nodeA, nodeB)

</chain>

6、ELSE:

用于条件判断的否定分支。ELSE关键字后面的节点只有在IF关键字后面的条件判断失败时才会执行

<chain name="chain1">

IF(conditionNode)

THEN(nodeA, nodeB)

ELSE(nodeC, nodeD)

</chain>

7、RETRY:

用于重试失败的节点。RETRY关键字后面的节点会在失败时重试执行

<chain name="chain1">

RETRY(nodeA, 3)

</chain>

8、RETRY_FOR_EACH:

用于重试失败的节点,并且对每个节点进行重试

<chain name="chain1">

RETRY_FOR_EACH(nodeA, nodeB, 3)

</chain>

9、RETRY_WHILE:

用于重试失败的节点,直到满足指定的条件

<chain name="chain1">

RETRY_WHILE(nodeA, conditionNode)

</chain>

10、RETRY_UNTIL:

用于重试失败的节点,直到满足指定的条件

<chain name="chain1">

RETRY_UNTIL(nodeA, conditionNode)

</chain>

三、Springcloud接入LiteFlow例子

1、定义节点nodeA、nodeB

复制代码
@LiteflowComponent("nodeA")
public class NodeA extends NodeComponent {
    @Override
    public void process() {
        System.out.println("NodeA executed");
        throw new RuntimeException("测试异常");
    }
}

@LiteflowComponent("nodeB")
public class NodeB extends NodeComponent {
    @Override
    public void process() {
        System.out.println("NodeB executed");
    }
}

2、定义配置文件

新增配置文件flow.xml文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<flow name="myFlow">
	<chain name="chainabc">
		THEN(nodeA, nodeB);
	</chain>
</flow>

注意,首次接入时,配置文件中如果按照以下方式书写,在加载时会报错:init flow executor cause error for path [classpath:flow.xml],reason: no content in this chain

<flow name="myFlow">

<chain name="chain1">

<then name="nodeA" />

<then name="nodeB" />

</chain>

</flow>

3、配置文件配置

application.yml文件中添加配置

复制代码
liteflow:
  rule-source: classpath:flow.xml

4、编写测试类

复制代码
@RestController
public class FlowController {

    @Resource
    private FlowExecutor flowExecutor;

    @GetMapping("/executeFlow")
    public String executeFlow() {
        LiteflowResponse response = flowExecutor.execute2Resp("chainabc");
        return response.getExecuteStepStr();
    }

}

@Resource
private FlowController flowController;

@Test
public void liteFlowTest() {
    flowController.executeFlow();
}

四、跳出节点的方式

1、抛异常

THEN(nodeA, nodeB, nodeC)

当 nodeA 节点抛出异常后,整个流程不再向下执行,失败之后的策略,可以在配置文件里配置,例如:重试几次、一直重试直到成功等等

五、规则编排适合使用的场景

在上边这个图中,A和B是顺序执行,C、D、H三个节点所在的线是并行的。三条线都执行完毕后,再接着执行X。

1、在金融系统中

复杂的渠道和资方,各自的流程有一样的,也有区别很大的,很适合编排,如果将配置文件放在nacos中,就能实现动态编排,实时生效。

2、在电商系统中

如果一个商品有M个优惠活动,有些能叠加,那么我们可以编排优惠的顺序,快速适应新需求调整计算顺序。


总结

实用,实用,实用,重要的事情说三遍!

相关推荐
Moonbit1 分钟前
用MoonBit开发一个C编译器
后端·编程语言·编译器
Reboot1 小时前
达梦数据库GROUP BY报错解决方法
后端
稻草人22221 小时前
java Excel 导出 ,如何实现八倍效率优化,以及代码分层,方法封装
后端·架构
渣哥1 小时前
原来 Java 里线程安全集合有这么多种
java
间彧1 小时前
Spring Boot集成Spring Security完整指南
java
掘金者阿豪1 小时前
打通KingbaseES与MyBatis:一篇详尽的Java数据持久化实践指南
前端·后端
间彧1 小时前
Spring Secutiy基本原理及工作流程
java
对象存储与RustFS1 小时前
Spring Boot集成RustFS十大常见坑点及解决方案|踩坑实录
后端
RoyLin2 小时前
TypeScript设计模式:原型模式
前端·后端·node.js
菜鸟谢2 小时前
Manjaro Tab 无自动补全
后端