基于“目标驱动”或推理形式的规则引擎与流程处理
优采云 发布时间: 2021-06-22 06:44基于“目标驱动”或推理形式的规则引擎与流程处理
什么是规则引擎
规则引擎是一系列基于某些算法执行规则的软件系统。规则引擎将Fact集合和传入系统的规则集合进行整合,触发一项或多项业务操作。规则通常以声明的方式在业务代码中实现,我们可能认为它很少改变。但实际上,这些业务逻辑的判断条件经常会发生变化。
本文文章中的业务逻辑或规则通常可以表述为“在一定的写作条件下,执行一定的任务”。
在具有大量规则和 Fact 对象的业务系统中,多个 Fact 输入可能会导致相同的输出。这种情况通常称为规则冲突。规则引擎可以使用不同的冲突解决方案来确定冲突规则的执行顺序。在规则引擎中,通常有两种执行方式:
前向链接:这是一个基于“数据驱动”的表单,基于插入的Fact对象和Fact对象的更新,规则引擎使用可用的Fact推理规则提取更多的Fact对象,直到计算最终目标,将匹配一个或多个规则并计划执行。因此,规则引擎从事实开始,从结论开始。
反向链接:这是“目标驱动”或推理的一种形式,与正向链接相反。反向链从规则引擎假设的结论开始。如果不能直接满足这些假设,则寻找满足假设的子目标。规则引擎会重复这个过程,直到结论被证明或者没有更多的子目标需要证明。
规则引擎和流程处理的区别
规则和流程的主要区别在于:业务流程代表业务做什么;规则引擎代表关于做什么业务的决定。
规则引擎可以看作是一个复杂的 if/then 语句解释器。解释的 if/then 语句称为规则。
规则的if部分用于处理条件,例如account.getMoney()
if (account.getMoney() < 0)
sendWarning(account);
规则存储在前向链接规则引擎中,即引擎执行一个执行周期,允许一个规则的运行触发其他规则的条件满足。这样,级联规则就会被激活,每个规则的操作都会被执行。前向链接规则引擎适用于从简单的输入(事实)中得出高级结论的场景。
上面的代码示例可以通过规则引擎写成如下形式:
global AccountManager manager;
rule "checkMoney"
when
$account : Account( money < 0 )
then
manager.warn($account);
end
很明显,一个规则文件由两个概念组成:
规则:用于控制业务流程的声明性语句。规则通常包括判断条件部分和执行操作部分。如果条件评估结果为真,则执行规则引擎操作部分。
事实:规则执行所需的数据。在上面的例子中,Account 是 Fact 对象。
规则引擎的优势
使用规则引擎可以给系统带来以下好处:
高灵活性:规则存储在知识库中,规则改变时可以轻松修改。
易于控制:规则比流程代码更容易理解,因此可以有效弥补业务分析师和开发人员之间的沟通问题。
降低复杂度:在程序中编写大量判断条件很可能会造成噩梦。使用规则引擎可以通过一致的表示更好地处理日益复杂的业务逻辑。
可重用性:规则的集中管理可以提高业务规则的可重用性。而且,传统的代码程序通常会添加不必要的变量,这些变量很可能会被重用。
需要注意的是,在业务规则变化不大,业务规则比较简单的情况下,不需要使用规则引擎。
开源规则引擎
Drools 规则引擎是一个开源的规则引擎,地址为:。 Drools 规则引擎可以通过存储、处理和评估数据来执行业务规则和决策模型。 Drools规则引擎最基本的功能是将输入数据或Fact对象与规则条件进行匹配,并根据匹配结果决定如何执行规则。
Drools 规则引擎基于以下组件运行:
规则:业务规则或 DMN 决策。所有规则必须至少收录触发规则的条件和相应的动作。
事实:输入到规则引擎的数据用于匹配规则的条件。
生产内存:规则存储在规则引擎中的位置。
工作内存:Fact 对象存储在规则引擎中的位置。
Agenda:存储激活规则的分类和排序的地方。
当用户或系统在 Drools 中添加或更新规则相关信息时,该信息会以一个或多个 Facts 的形式插入到 Drools 规则引擎的工作内存中。 Drools 规则引擎匹配存储在生产内存中的 Fact 和规则,并过滤满足执行条件的规则。对于满足条件的规则,规则引擎会激活并在议程中注册相应的规则。在议程中,Drools 会对优先级进行排序并解决冲突,并为规则的执行做准备。
下图概述了相关操作:
Drools 引擎是 KIE(知识就是一切)项目的一部分,除了 Drools 之外,该项目还包括:
jBPM:jBPM 是一个灵活的业务流程管理组件,它允许您通过描述实现这些目标所需的步骤来为业务目标建模。
OptaPlanner 是一个约束求解器,可以优化员工调度、车辆路线、任务分配和云优化等用例。
Business Central 是一个功能齐全的网络应用程序,用于可视化地编写自定义业务规则和流程。
UberFire 是一个基于 Web 的工作台框架,其灵感来自 Eclipse 富客户端平台。
Drool 规则示例,注意 Java Bean 模型和示例 DRL 规则:
public class Applicant {
private String name;
private int age;
private boolean valid;
// Getter and setter methods
}
以下是用于检查申请人年龄的简单 DRL 规则示例:
package com.company.license
rule "Is of valid age"
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end
未满 18 周岁的申请者将拒绝上述规则。
//Create the KIE container
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
//Instantiate the stateless KIE session and enter data
StatelessKieSession kSession = kContainer.newStatelessKieSession();
Applicant applicant = new Applicant("Mr John Smith", 16);
assertTrue(applicant.isValid());
ksession.execute(applicant);
assertFalse(applicant.isValid());
OpenL 平板电脑
OpenL Tablets() 是一个基于 Excel 文档的业务规则管理系统和业务规则引擎。基于独特的概念,OpenL Tablets 有助于将收录业务逻辑规范的业务文档视为可执行的源代码。由于企业用户熟悉OpenL Tablets使用的表格格式,OpenL Tablets架起了企业用户和开发者之间的桥梁,从而减少了代价高昂的企业软件开发错误,大大缩短了软件开发周期。简单来说,您可以将 OpenL Tablets 视为一个表格处理器,可以从 Excel 文档中提取表格并通过应用程序访问它们。
OpenL Tablets 的主要优势:
使用 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) rulesFactory.newInstance();
rules.hello1(12);
}
}
使用OpenL Tablets,需要引入以下依赖:
com.deliveredtechnologies
rulebook-core
0.11
简单规则
Easy Rules() 是一个简单但功能强大的 Java 规则引擎,提供以下功能:
简而言之,Easy Rules 提供了 Rule 抽象来创建带有条件和操作的规则,并提供 RuleEngine API,它使用一组规则来评估条件并执行操作。
要启用 Easy Rules,需要在 pom.xml 中引入以下依赖项:
org.jeasy
easy-rules-core
3.4.0
创建一个总是触发并打印“hello word”到控制台的规则:
@Rule(name = "Hello World rule", description = "Always say hello world")
public class HelloWorldRule {
@Condition
public boolean when() {
return true;
}
@Action
public void then() throws Exception {
System.out.println("hello world");
}
}
创建规则引擎并触发规则:
public class Launcher {
public static void main(String[] args) {
// create facts
Facts facts = new Facts();
// create rules
Rules rules = new Rules();
rules.register(new HelloWorldRule());
// create a rules engine and fire rules on known facts
RulesEngine rulesEngine = new DefaultRulesEngine();
rulesEngine.fire(rules, facts);
}
}
RuleBook 规则引擎
厌倦了泛滥的 if/then/else 语句类?您是否需要一个好的抽象方法来轻松地以一种将规则彼此分开的方式指定规则?您想像编写其余代码一样编写规则吗? RuleBook 可能是您要选择的规则抽象。
RuleBook 是一个规则引擎,旨在以 Java 开发人员熟悉的方式创建规则。 RuleBook 还允许您使用易于使用的支持 Lambda 的域特定语言或自定义 POJO 来指定规则。
使用RuleBook需要在pom.xml中引入如下依赖:
com.deliveredtechnologies
rulebook-core
0.11
使用示例:
public class ExampleRule {
public RuleBook defineHelloWorldRules() {
return RuleBookBuilder
.create()
.addRule(rule -> rule.withNoSpecifiedFactType()
.then(f -> System.out.print("Hello ")))
.addRule(rule -> rule.withNoSpecifiedFactType()
.then(f -> System.out.println("World")))
.build();
}
}
以如下方式执行:
public static void main(String[] args) {
ExampleRule ruleBook = new ExampleRule();
ruleBook
.defineHelloWorldRules()
.run(new FactMap());
}