【转】什么是规则引擎(Drools、OpenLTablets、
EasyRules、Rule。。。
发表于:
分类:,
标签:, , , ,
什么是规则引擎
规则引擎是根据⼀些算法执⾏规则的⼀些列软件系统。规则引擎整合了传⼊系统的Fact集合和规则集合,从⽽去触发⼀个或多个业务操作。规则通常以声明式的⽅式在业务代码中实现,我们可能以为它很少会被改变。但事实上,这些业务逻辑的判断条件经常会被改变。
在本篇⽂章中的业务逻辑或规则,通常是可以表⽰为“在某写条件下,执⾏某些任务”。
在拥有⼤量规则和Fact对象的业务系统中,可能会出现多个Fact输⼊都会导致同样的输出,这种情况我们通常称作规则冲突。规则引擎可以采⽤不同的冲突解决⽅案来确定冲突规则的执⾏顺序。在规则引擎中,通常有两种执⾏⽅式:
正向链接:这是⼀种基于“数据驱动”的形式,基于插⼊的Fact对象和Fact对象的更新,规则引擎利⽤可⽤的Fact推理规则来提取出更多的Fact对象,直到计算出最终⽬标,最终会有⼀个或多个规则被匹配,并计划执⾏。因此,规则引擎始于事实,始于结论。
反向链接:这是⼀种基于“⽬标驱动”或推理形式,与正向链接相反。反向链条从规则引擎假设的结论开始,如果不能够直接满⾜这些假设,则搜索可满⾜假设的⼦⽬标。规则引擎会循环执⾏这⼀过程,直到证明结论或没有更多可证明的⼦⽬标为⽌。
规则引擎与流程处理的区别
规则与过程的不同之处主要在于:业务流程代表业务做了什么;规则引擎代表决定做什么业务。
规则引擎可以被视为复杂的if / then语句解释器。被解释的if / then语句称为规则。
规则的if部分⽤于处理条件,⽐如Money() < 0;规则的then部分包含执⾏的操作,⽐如sendWarning(account)。
if (Money() < 0)
sendWarning(account);
规则存储在正向链接规则引擎中,即引擎执⾏⼀个执⾏周期,该周期允许⼀个规则的操作触发其他规则的条件得到满⾜。这样,级联的规则会被激活,同时每条规则的操作都会被执⾏。正向链接的规则引擎适⽤于从简单输⼊(Fact)得出⾼层次的结论的场景。
上⾯的代码⽰例,通过规则引擎可写成如下形式:
global AccountManager manager;
rule "checkMoney"
when
$account : Account( money < 0 )
then
manager.warn($account);
end
显⽽易见,⼀个规则⽂件是由两个概念组成:
规则:⽤于控制业务流程的声明式语句。⼀个规则通常包含判断条件部分和执⾏操作部分。如果条件评估结果为true,则执⾏规则引擎操作部分。
Fact:规则执⾏所需要的数据。在上⾯的⽰例中Account便是Fact对象。
规则引擎的优势
使⽤规则引擎可以给系统带来如下优势:
⾼灵活性:在规则保存在知识库中,可以在规则变动轻易做出修改。
容易掌控:规则⽐过程代码更易于理解,因此可以有效地来弥补业务分析师和开发⼈员之间的沟通问题。
applicant是什么意思降低复杂度:在程序中编写⼤量的判断条件,很可能是会造成⼀场噩梦。使⽤规则引擎却能够通过⼀致的表⽰形式,更好的处理⽇益复杂的业务逻辑。
可重⽤性:规则集中管理,可提⾼业务的规则的可重⽤性。⽽且,传统的代码程序通常会添加不必要的变数,很然进⾏重复利⽤。
需要留意的是,在业务规则没有太多变动,业务规则⽐较简单的情况下,是没有必要使⽤规则引擎的。
开源规则引擎
Drools规则引擎是⼀款开源的规则引擎,地址为: 。Drools规则引擎可通过存储、处理和评估数据来执⾏业务规则和决策模型。Drools规则引擎最基础的功能是将输⼊的数据或Fact对象和规则条件进⾏匹配,并根据匹配结果决定如何执⾏规则。
Drools规则引擎基于以下组件运⾏:
规则:业务规则或DMN决策。所有规则必须⾄少包含触发该规则的条件以及对应的操作。
Fact:输⼊到规则引擎的数据,⽤于规则的条件的匹配。
⽣产内存:规则引擎中规则存储的地⽅。
⼯作内存:规则引擎中Fact对象存储的地⽅。
议程:⽤于存储被激活的规则的分类和排序的地⽅。
当⽤户或系统在Drools中添加或更新规则相关的信息时,该信息会以⼀个或多个Fact的形式插⼊Drools规则引擎的⼯作内存中。Drools规则引擎匹配Fact和存储在⽣产内存中规则,筛选符合执⾏条件的规则。对于满⾜条件的规则,规则引擎会在议程中激活和注册对应的规则,在议程中Drools会进⾏优先级的排序和冲突的解决,准备规则的执⾏。
下图概述了相关操作:
Drools引擎是KIE(知识就是⼀切)项⽬的⼀部分,该项⽬除了Drools之外还包括:
jBPM:jBPM是⼀种灵活的业务流程管理组件,允许你通过描述实现这些⽬标所需执⾏的步骤来对业务⽬标进⾏建模。
OptaPlanner是⼀个约束解决器,可以优化⽤例,例如员⼯排班,车辆路线,任务分配和云优化。
Business Central是功能齐全的Web应⽤程序,⽤于可视化组成⾃定义业务规则和流程。
UberFire是⼀个基于Web的⼯作台框架,其灵感来⾃Eclipse Rich Client Platform。
Drool规则的⽰例,留意⼀下的Java Bean模型和⽰例DRL规则:
public class Applicant {
private String name;
private int age;
private boolean valid;
// Getter and setter methods
}
下⾯是⼀个⽤于检查申请⼈年龄的简单DRL规则⽰例:
package company.license
rule "Is of valid age"
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end
上述规则,对于未满18岁的申请⼈,将会拒绝。
//Create the KIE container
KieServices kieServices = ();
KieContainer kContainer = KieClasspathContainer();
//Instantiate the stateless KIE session and enter data
StatelessKieSession kSession = wStatelessKieSession();
Applicant applicant = new Applicant("Mr John Smith", 16);
assertTrue(applicant.isValid());
assertFalse(applicant.isValid());
OpenL Tablets
OpenL Tablets主要优点:
OpenL Tablets消除了软件实施与业务⽂档,规则和策略之间的鸿沟。
业务规则对开发⼈员变得透明。
OpenL Tablets验证所有项⽬⽂档数据中的语法和类型错误,从⽽提供⽅便且详细的错误报告。 OpenL Tablets可以直接指向Excel⽂档中的问题。
OpenL Tablets提供了计算解释功能,可以通过指向原始⽂档中的源参数来扩展任何计算结果。
OpenL Tablets使⽤户能够创建和维护测试,以确保所有规则的可靠⼯作。
OpenL Tablets在所有项⽬⽂档中提供交叉索引和搜索功能。
OpenL Tablets通过其业务规则管理应⽤程序提供完整的规则⽣命周期⽀持。
OpenL Tablets⽀持.xls和.xlsx⽂件格式。
使⽤OpenL Tablets API可访问Excel表中的规则和数据。 OpenL Tablets提供了⼀个包装器,以⽅便使⽤。 例如,考虑以下在Excel⽂档中编码的规则:
在hello1中只有⼀个规则:
public interface Simple {
void hello1(int i);
}
基于包装器运⾏规则:
import static java.lang.System.out;
import org.openl.rules.runtime.RulesEngineFactory;
public class Example {
public static void main(String[] args) {
//define the interface
RulesEngineFactory < Simple > rulesFactory =
new RulesEngineFactory < Simple > ("TemplateRules.xls",
Simple.class);
Simple rules = (Simple) wInstance();
rules.hello1(12);
}
}
使⽤OpenL Tablets,需要引⼊如下依赖:
<dependency>
<groupId>com.deliveredtechnologies</groupId>
<artifactId>rulebook-core</artifactId>
<version>0.11</version>
</dependency>
Easy Rules
轻巧的框架和易于学习的API
基于POJO的开发
抽象定义业务规则,可轻松使⽤
⽀持从原始规则创建复合规则
⽀持使⽤表达式语⾔(如MVEL和SpEL)定义规则
简⽽⾔之,Easy Rules提供了Rule抽象以创建具有条件和操作的规则,并提供了RuleEngine API,该API通过⼀组规则去评估条件并执⾏操作。
要使Easy Rules需引⼊以下依赖项到l中:
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-core</artifactId>
<version>3.4.0</version>
</dependency>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论