赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
提示:以下是本篇文章正文内容,下面案例可供参考
在日常的开发过程中,经常会遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。
在这样的场景下,使用策略和模板模式的结合可以很好的解决这个问题,但是使用编码的方式会使得文件太多,在业务的部分环节可以这样操作,在项目角度就无法一眼洞穿其中的环节和逻辑。
在本文中,将引入规则引擎从全局角度来解决这个问题,这就是今天要介绍的主角 liteflow。
liteflow 是一个轻巧而且强大的规则引擎,能够实现开箱即用,可以在短时间内就可以完成复杂的规则编排,下图是 liteflow 的整体架构。liteflow 支持较多的规则文件格式,比如 xml/json/yaml, 对于规则文件的存储方式可以有sql/zk/nacos/apollo 等。
官网地址:LiteFlow
用于定义流程链中的节点顺序。节点按照THEN关键字后面的顺序执行
<chain name="chain1">
THEN(nodeA, nodeB, nodeC)
</chain>
用于定义条件节点。WHEN关键字后面的节点只有在满足条件时才会执行
<chain name="chain1">
WHEN(conditionNode)
THEN(nodeA, nodeB)
</chain>
用于并行执行多个节点。AND关键字后面的节点会同时执行
<chain name="chain1">
AND(nodeA, nodeB)
</chain>
用于定义多个节点中的任意一个执行。OR关键字后面的节点会按照顺序执行,直到找到一个成功执行的节点
<chain name="chain1">
OR(nodeA, nodeB)
</chain>
用于条件判断。IF关键字后面的节点只有在满足条件时才会执行
<chain name="chain1">
IF(conditionNode)
THEN(nodeA, nodeB)
</chain>
用于条件判断的否定分支。ELSE关键字后面的节点只有在IF关键字后面的条件判断失败时才会执行
<chain name="chain1">
IF(conditionNode)
THEN(nodeA, nodeB)
ELSE(nodeC, nodeD)
</chain>
用于重试失败的节点。RETRY关键字后面的节点会在失败时重试执行
<chain name="chain1">
RETRY(nodeA, 3)
</chain>
用于重试失败的节点,并且对每个节点进行重试
<chain name="chain1">
RETRY_FOR_EACH(nodeA, nodeB, 3)
</chain>
用于重试失败的节点,直到满足指定的条件
<chain name="chain1">
RETRY_WHILE(nodeA, conditionNode)
</chain>
用于重试失败的节点,直到满足指定的条件
<chain name="chain1">
RETRY_UNTIL(nodeA, conditionNode)
</chain>
- @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");
- }
- }
新增配置文件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>
application.yml文件中添加配置
- liteflow:
- rule-source: classpath:flow.xml
- @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();
- }
THEN(nodeA, nodeB, nodeC)
当 nodeA 节点抛出异常后,整个流程不再向下执行,失败之后的策略,可以在配置文件里配置,例如:重试几次、一直重试直到成功等等
在上边这个图中,A和B是顺序执行,C、D、H三个节点所在的线是并行的。三条线都执行完毕后,再接着执行X。
复杂的渠道和资方,各自的流程有一样的,也有区别很大的,很适合编排,如果将配置文件放在nacos中,就能实现动态编排,实时生效。
如果一个商品有M个优惠活动,有些能叠加,那么我们可以编排优惠的顺序,快速适应新需求调整计算顺序。
实用,实用,实用,重要的事情说三遍!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。