Drools easy-rules liteflow
规则格式 xml json、yml、注解、builder xml、json、yml、注解、builder
表达式 支持 MVEL、SpEL、JEXL 通过脚本支持
循环 支持 支持 不支持
条件 支持 支持 支持
可视化 支持 可自行实现 可自行实现
热更新 支持 可自行实现 支持
生态 完善 一般 一般
文档 一般 一般
备注 成熟,相关组件多,需要编写xml规则文件,学习成本高 较成熟,基于注解的编程模型,学习成本低,但不活跃 自研规则表达式,学习成本较低,有断更风险

为什么需要

当规则复杂且分支较多,难以应对变化,难以维护,不能及时生效,需要重启服务
https://www.cnblogs.com/dalianpai/p/14759526.html

Drools

Drools 是用 Java 语言编写的开放源码规则引擎,基于Apache协议,基于RETE算法,功能强大,老牌规则引擎,生态完善,但太重了。

  • Drools相关的组件太多,需要逐个研究才知道是否需要
  • Drools逻辑复杂,不了解原理,一旦出现问题排查难度高
  • Drools需要编写规则文件,学习成本高
rule rule_001
 when
 $p:Person(name=="张三",birthday=="1987-07-24");
 then
 $p.setName("李四");
 update($p); 
 System.out.println("执行了 name==\"张三\",birthday==\"1987-07-24\" 规则");
 System.out.println("改完后的名字:"+$p.getName());
end

Easy Rules

轻量级的java规则引擎,学习成本低,代码优雅,但2年前停止维护

  • 轻量级框架和易于学习的API
  • 基于POJO的开发与注解的编程模型
  • 定义抽象的业务规则并轻松应用它们
  • 支持从简单规则创建组合规则的能力
  • 支持使用表达式语言(如MVEL和SpEL)定义规则的能力
Rule ageRule = new MVELRule()
        .name("age rule")
        .description("Check if person's age is > 18 and marks the person as adult")
        .priority(1)
        .when("person.age > 18")
        .then("person.setAdult(true);");

https://github.com/j-easy/easy-rules/wiki/fizz-buzz

liteflow

国产组件式规则引擎框架,但比较年轻。

  • 规则文件格式丰富
  • 支持脚本语言
  • 热刷新
  • 支持重试
  • 声明式组件
<chain name="chain1">
    THEN(
        a,
        WHEN(
            b,
            SWITCH(c).to(d,e)
        ),
        f
    );
</chain>

https://liteflow.yomahub.com/