规则引擎
# 专题1 规则引擎
在 Java 领域,开源的规则引擎,没有太多的选择,直接选择 Drools 就对了。
DROOLS(JBOSS RULES )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
用XML节点来规范If--Then句式和事实的定义,使引擎干起活来很舒服。 而使用Java,Groovy等原生语言来做判断和执行语句,让程序员很容易过渡、移植,学习曲线很低。
DROOLS 是一个基于 CHARLES FORGY'S 的 RETE 算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。 业务分析师人员或审核人员可以利用它轻松查看业务规则,检验已编码的规则执行了所需的业务规则。
当前最新版本为 7.32.0.Final ,可到官网下载 (opens new window)。
当前,大多数规则引擎库都实现了称为 Java Rule API Engine (opens new window) 的 JSR94标准。
还有一些开源的规则引擎:
OpenL Tablets是一个业务规则管理系统和一个基于Excel决策表的业务规则引擎。由于此框架使用的表格格式对业务用户来说很熟悉,因此它弥合了业务用户和开发人员之间的差距。
Easy Rules是一个简单的Java规则引擎,提供轻量级和基于POJO的框架来定义业务。它可以通过使用复合模式从原始规则创建复杂规则。
与最传统的规则引擎相比,此框架不使用XML文件或任何域特定语言文件来将规则与应用程序隔离。它使用基于注释的类和方法将业务逻辑注入应用程序。
Easy Rules可以方便开发人员使用与应用程序本身完全分离的业务逻辑来创建和维护应用程序。另一方面,由于此框架未实现JSR94标准,因此业务逻辑必须直接编码为Java代码。
RuleBook是一个Java框架,它利用Java 8 lambdas和责任链模式来使用简单的BDD方法定义规则。
与大多数规则引擎一样,RuleBook使用“Facts” 的概念,即提供给规则的数据。RuleBook允许规则修改Facts的状态,然后可以通过链中的规则读取和修改。对于读取一种类型的数据(Facts)并输出不同类型的结果的规则,RuleBook具有Decisions。
RuleBook可以使用Java DSL与Spring集成。
# 1.1 概念
Java规则引擎起源于基于规则的专家系统,而基于规则的专家系统又是专家系统的其中一个分支。专家系统属于人工智能的范畴,它模仿人类的推理方式,使用试探性的方法进行推理,并使用人类能理解的术语解释和证明它的推理结论。
推理引擎包括三部分:模式匹配器(Pattern Matcher)、议程(Agenda)和执行引擎(Execution Engine)。推理引擎通过决定哪些规则满足事实或目标,并授予规则优先级,满足事实或目标的规则被加入议程。模式匹配器决定选择执行哪个规则,何时执行规则;议程管理模式匹配器挑选出来的规则的执行次序;执行引擎负责执行规则和其他动作。
和人类的思维相对应,推理引擎存在两者推理方式:演绎法(Forward-Chaining)和归纳法(Backward-Chaining)。演绎法从一个初始的事实出发,不断地应用规则得出结论(或执行指定的动作)。而归纳法则是根据假设,不断地寻找符合假设的事实。Rete算法是目前效率最高的一个 Forward-Chaining推理算法,许多Java规则引擎都是基于Rete算法来进行推理计算的。
推理引擎的推理步骤如下:
将初始数据(fact)输入Working Memory。
使用Pattern Matcher比较规则库(rule base)中的规则(rule)和数据(fact)。
如果执行规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放入冲突集合。
解决冲突,将激活的规则按顺序放入Agenda。
使用执行引擎执行Agenda中的规则。重复步骤2至5,直到执行完毕所有Agenda中的规则。
上述即是规则引擎的原始架构,Java规则引擎就是从这一原始架构演变而来的。
Drools是基于正向推理的规则引擎。正向推理是数据驱动的,facts事实被传递到工作空间中,在那里有一个或多个规则与这些事实匹配,并由Agenda安排执行—我们从一个事实开始,传递事实,最后得到一个结论。
产生式规则是一个用一阶逻辑进行知识呈现的二元结构。
when
then
2
3
Drools 中的 Rete算法被称为 ReteOO,表示 Drools 为面向对象系统(Object Oriented systems)增强并优化了Rete 算法。
规则引擎的优点:
声明式编程:使用规则更加容易对复杂的问题进行表述,并得到验证;
逻辑与数据分离:数据保存在系统对象中,逻辑保存在规则中。这根本性的打破了面向对象系统中将数据和逻辑耦合起来的局面;
速度及可测量性:Drools的Rete、Leaps算法,提供了对系统数据对象非常有效率的匹配,这些算法经过了大量实际考验的证明。
何时使用?
业务逻辑经常发生改变;
代码中有很多 if else switch 和其它凌乱的逻辑,且总是易变的。