规则引擎深度对比,LiteFlow vs Drools!( 二 )


  • 框架的性能表现
  • 下面就从这几个方面来细细比较两款框架的表现力
    规则表达式Drools的规则表达式为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现 。
    Drools的规则表达式贴近自然编程语言 , 拥有自己的扩展名文件drl , 语法支持全 , 基本上自然编程语言有的语法drl全有 。所以 , 完全可以把java的逻辑写在drl文件中 。
    来看下drl文件的大体样子:
    规则引擎深度对比,LiteFlow vs Drools!

    文章插图
    可以看到 , Drools定义规则的方式是一个规则一段 , 有明确的when...then , 表示当满足什么条件时 , 做什么 。在触发规则时候 , 会自动判断该去执行哪一段rule , 如果满足多个条件 , 是可以触发多个规则的then的 。
    LiteFlow编排表达式简单易懂 , 底层用EL表达式语言包装而成 。用于组件的流转 , 支持异步 , 选择 , 条件 , 循环 , 嵌套等一些场景 。
    组件层面不仅可以是java组件 , 还可以用脚本语言来编写 , 目前支持了Groovy和QLExpress两种脚本语言 。所有能用java实现的 , 用脚本语言都可以做到 。
    LiteFlow的规则文件大体长这个样子:
    规则引擎深度对比,LiteFlow vs Drools!

    文章插图
    上述LiteFlow的编排表达式中 , 所表达的是下面一个逻辑流:
    规则引擎深度对比,LiteFlow vs Drools!

    文章插图
    LiteFlow编排表达式支持THEN(同步) , WHEN(异步) , SWITCH(选择) , IF(条件) , FOR(次数循环) , WHILE(条件循环)等大表达式 , 每个表达式又有许多扩展关键字可供选用 。
    脚本组件支持的Groovy基本和java语法差不多 , Groovy语言支持的一切你均可使用 。甚至可以在Groovy语法中额外定义类和方法 。
    结论
    总的来说 , 两款框架都能用脚本来定义逻辑片段 , 在定义逻辑片段层面 , Drools使用的是自研语法 , LiteFlow使用的是插件式的Groovy , 其实个人觉得Groovy更接近java语法 , 你甚至于可以在其中定义类和方法 。Drools在高级应用中 , 也可以用规则定义方法 , 但是我觉得并不那么自然 。
    LiteFlow最大的特点是除了定义逻辑片段外 , 还可以进行全局组件的编排 。而这正是LiteFlow称之为编排式规则引擎的由来 。使用简单的编排语法可以设计出复杂的逻辑流 。支持java和脚本混编 。
    和Java的数据交换在Drools的规则中 , 你可以通过import关键字来引入java的一些类包类进行调用 。
    在LiteFlow的脚本组件中 , Groovy也可以通过import 来引入java的任何包来调用 。
    Drools中 , 可以直接引用到fact对象 。
    LiteFlow中 , 可以直接引用到context对象 , context上下文贯穿整个编排链路 。
    LiteFlow中 , 通过@ScriptBean注解 , 你甚至可以把spring上下文中的bean引入进来直接调用 。利用这个特性 , 甚至于可以在脚本中调用rpc , 调用数据库dao对象取数据 。这个在Drools里面虽然也可以做到 , 但是要麻烦的多 。
    结论
    基本都能满足和java的数据交换需求 , 但是LiteFlow在场景上支持的显然更加多一点 。
    API以及集成在API调用层面 , Drools需要去定义KieContainer , KBase , KSession一系列对象 。LiteFlow框架只需要使用到LiteFlowExecutor对象 。

    经验总结扩展阅读