程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上
以上图片来自AI:https://www.gnomic.cn/?feigpt
LiteFlow
LiteFlow是一个非常强大的现代化的规则引擎框架,融合了编排特性和规则引擎的所有特性。
使用场景
LiteFlow适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。
优势
利用LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow拥有开源规则引擎最为简单的DSL语法。十分钟就可上手。
组件可实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。
LiteFlow的脚本组件,支持众多脚本语言,完全和Java打通,你可以用脚本来实现任何逻辑。
LiteFlow支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便你定制。
实操
添加依赖
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.11.4</version>
</dependency>
配置
application.yml
liteflow:
#规则文件路径
rule-source: config/flow.el.xml
#-----------------以下非必须-----------------
#liteflow是否开启,默认为true
enable: true
#liteflow的banner打印是否开启,默认为true
print-banner: true
#zkNode的节点,只有使用zk作为配置源的时候才起作用,默认为/lite-flow/flow
zk-node: /lite-flow/flow
#上下文的最大数量槽,默认值为1024
slot-size: 1024
#FlowExecutor的execute2Future的线程数,默认为64
main-executor-works: 64
#FlowExecutor的execute2Future的自定义线程池Builder,LiteFlow提供了默认的Builder
main-executor-class: com.yomahub.liteflow.thread.LiteFlowDefaultMainExecutorBuilder
#自定义请求ID的生成类,LiteFlow提供了默认的生成类
request-id-generator-class: com.yomahub.liteflow.flow.id.DefaultRequestIdGenerator
#并行节点的线程池Builder,LiteFlow提供了默认的Builder
thread-executor-class: com.yomahub.liteflow.thread.LiteFlowDefaultWhenExecutorBuilder
#异步线程最长的等待时间(只用于when),默认值为15000
when-max-wait-time: 15000
#异步线程最长的等待时间(只用于when),默认值为MILLISECONDS,毫秒
when-max-wait-time-unit: MILLISECONDS
#when节点全局异步线程池最大线程数,默认为16
when-max-workers: 16
#并行循环子项线程池最大线程数,默认为16
parallelLoop-max-workers: 16
#并行循环子项线程池等待队列数,默认为512
parallelLoop-queue-limit: 512
#并行循环子项的线程池Builder,LiteFlow提供了默认的Builder
parallelLoop-executor-class: com.yomahub.liteflow.thread.LiteFlowDefaultParallelLoopExecutorBuilder
#when节点全局异步线程池等待队列数,默认为512
when-queue-limit: 512
#是否在启动的时候就解析规则,默认为true
parse-on-start: true
#全局重试次数,默认为0
retry-count: 0
#是否支持不同类型的加载方式混用,默认为false
support-multiple-type: false
#全局默认节点执行器
node-executor-class: com.yomahub.liteflow.flow.executor.DefaultNodeExecutor
#是否打印执行中过程中的日志,默认为true
print-execution-log: true
#是否开启本地文件监听,默认为false
enable-monitor-file: false
#简易监控配置选项
monitor:
#监控是否开启,默认不开启
enable-log: true
#监控队列存储大小,默认值为200
queue-limit: 200
#监控一开始延迟多少执行,默认值为300000毫秒,也就是5分钟
delay: 300000
#监控日志打印每过多少时间执行一次,默认值为300000毫秒,也就是5分钟
period: 300000
定义组件
普通组件
@Component("a")
public class ACmp extends NodeComponent {
@Override
public void process() {
//do your business
String params = (String)this.getRequestData();
System.out.println("A 组件执行。。。接受参数:"+ params);
}
}
@Component("b")
public class BCmp extends NodeComponent {
@Override
public void process() {
//do your business
String params = (String)this.getRequestData();
System.out.println("B 组件执行。。。接受参数:"+ params);
}
}
@Component("c")
public class CCmp extends NodeComponent {
@Override
public void process() {
//do your business
System.out.println("C 组件执行。。。");
}
}
选择组件
@Component("switch")
public class SwitchCmp extends NodeSwitchComponent {
@Override
public String processSwitch() {
//do your business
System.out.println("switch 组件执行。。。");
return "b";
}
}
条件组件
@Component("e")
public class ECmp extends NodeIfComponent {
@Override
public boolean processIf() throws Exception {
return true;
}
}
次数循环组件
@Component("f")
public class FCmp extends NodeForComponent {
@Override
public int processFor() throws Exception {
return 3;
}
}
条件循环组件
@Component("while")
public class WhileCmp extends NodeWhileComponent {
@Override
public boolean processWhile() throws Exception {
return true;
}
}
迭代循环组件
@Component("h")
public class HCmp extends NodeIteratorComponent {
@Override
public Iterator<?> processIterator() throws Exception {
ArrayList<String> list = ListUtil.toList("a", "b", "c");
return list.iterator();
}
}
退出循环组件
@Component("g")
public class GCmp extends NodeBreakComponent {
@Override
public boolean processBreak() throws Exception {
System.out.println("break g组件执行中。。。");
//为true则退出循环
return true;
}
}
定义规则文件
resource/config下定义flow.el.xml
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<!--串行编排-->
<chain name="chain1">
THEN(a, b, c);
</chain>
<!--并行编排-->
<chain name="chain2">
WHEN(a, b, c);
</chain>
<!--选择编排-->
<chain name="chain3">
SWITCH(switch).to(b, c).DEFAULT(b);
</chain>
<!--条件编排-->
<chain name="chain4">
IF(e, a,b);
</chain>
<!--循环编排-->
<chain name="chain5">
FOR(f).DO(THEN(a, b));
</chain>
<chain name="chain6">
WHILE(while).DO(THEN(a, b)).BREAK(g);
</chain>
<chain name="chain7">
ITERATOR(h).DO(THEN(a, b));
</chain>
</flow>
执行链路
@Controller
public class FlowController {
@Resource
private FlowExecutor flowExecutor;
@RequestMapping("/flow")
@ResponseBody
public void flow() {
LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg-1");
}
@RequestMapping("/flow2")
@ResponseBody
public void flow2() {
LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg-2");
}
@RequestMapping("/flow3")
@ResponseBody
public void flow3() {
LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg-3");
}
@RequestMapping("/flow4")
@ResponseBody
public void flow4() {
LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg-4");
}
@RequestMapping("/flow5")
@ResponseBody
public void flow5() {
LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg-5");
}
@RequestMapping("/flow6")
@ResponseBody
public void flow6() {
LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg-6");
}
@RequestMapping("/flow7")
@ResponseBody
public void flow7() {
LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg-7");
}
}
启动
可以看到组件被扫描日志
执行日志
更多功能见官方文档
LiteFlow官网
gitee地址
github地址
系列文章索引
MyBatis的插件能在哪些地方进行拦截?
了解MyBatis的缓存机制吗
面试官:谈谈对volatile的理解
Spring中用到了哪些设计模式
面试官:说一下SQL的执行过程
线程池的工作原理