赞
踩
规则引擎,是业务规则管理系统的一部分,主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模板编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。规则引擎通过业务规则管理系统(BRMS,Business Rule Management System)来实现对业务规则的集中管理和动态执行。
规则引擎的主要特点和好处:
目前市面上具体的规则引擎产品有:
Drools 是一款开源的业务规则管理系统和规则引擎,由Jboss(现为红帽)开发和维护。Drools完全使用Java语言开发,基于Charles Forgy的RETE算法实现规则的高效执行。它提供了强大的规则管理和执行功能,能够帮助用户更好地管理和执行业务规则。
Drools被分解为几个模块,部分在规则开发/编译过程中需要,另一部分在运行时需要。在大多数情况下,项目只需要运行时包含的所有模块或者依赖,这种方式能提供更好的灵活性。所以运行时规则引擎的jar可以压缩到极致,只需要3个jar包(几百KB)。
以下是组成JBoss Drools的重要库的描述:
knowledge-api.jar
:提供一组接口和类,有助于清楚地显示什么是用户API,什么是引擎API。
knowledge-internal-api.jar
:提供了内部接口和工厂。
drools-core.jar
: 核心引擎,运行时组件。包含RETE算法引擎和LEAPS前向推理算法引擎。如果你正在预编译规则(并通过Package或RuleBase对象进行部署),这是唯一的运行时依赖项。
预编译规则(pre-compiling rules)指将规则在运行时之前进行编译的过程。通过预编译规则,可以提高规则引擎的执行效率。
drools-compiler.jar
: 包含编译器/构建器组件,以获取规则源,并构建可执行规则库。这通常是应用程序的运行时依赖项,但如果你正在预编译规则,则不必依赖。这取决于drools-core。
drools-jsr94.jar
: 这符合JSR-94的实现,这本质上是drools-compiler组件上的一个层。请注意,由于JSR-94规范的性质,并非所有功能都很容易通过此接口暴露。在某些情况下,直接访问Drools API会更容易,但在某些环境中,JSR-94是强制性的。
drools-decisiontables.jar
: 这是决策表“编译器”组件,它使用drools-编译器组件。这支持excel和csv输入格式。
上述组件还需要相当多的其他依赖项,其中大多数用于drools-compiler、drools-jsr94或drools-decisiontables模块。
Drools引擎是Drools中的规则引擎。Drools引擎存储、处理和评估数据,以执行定义好的业务规则或决策模型。Drools引擎的基本功能是将传入的数据或事实与规则的条件相匹配,并确定是否以及如何执行规则。
Drools引擎使用以下基本部件运行:
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.6.0.Final</version>
</dependency>
import lombok.Data;
import java.io.Serializable;
/**
* @Name: UserIn
* @Description: 用户规则的输入对象
* @Author: ahao
* @Date: 2024/6/28 11:43 PM
*/
@Data
public class UserIn implements Serializable {
/**
* 年龄:[0,100]
*/
private Integer age;
}
import lombok.Data;
import java.io.Serializable;
/**
* @Name: UserOut
* @Description: 用户规则的输出对象
* @Author: ahao
* @Date: 2024/6/28 11:46 PM
*/
@Data
public class UserOut implements Serializable {
/**
* 年龄阶段::0-6岁为婴幼儿;7-12岁为少儿;13-17岁为青少年;18-45岁为青壮年;46-69岁为中年;69岁以上为老年
*/
private String ageStages;
}
位置:classpath:drools/drl/user.drl
package drools.drl
// 导入输入类型
import com.ahao.project.input.UserIn;
// 以全局变量的形式,定义输出类型
global com.ahao.project.output.UserOut output;
//0-6岁为婴幼儿;
rule "age_0_6"
activation-group "age_stage"
enabled true
when
input:com.ahao.project.input.UserIn(age >= 0 && age <= 6);
then
output.setAgeStages("婴幼儿");
end
// 7-12岁为少儿;
rule "age_7_12"
activation-group "age_stage"
enabled true
when
input:com.ahao.project.input.UserIn(age >= 7 && age <= 12);
then
output.setAgeStages("少儿");
end
// 13-17岁为青少年;
rule "age_13_17"
activation-group "age_stage"
enabled true
when
input:com.ahao.project.input.UserIn(age >= 13 && age <= 17);
then
output.setAgeStages("青少年");
end
// 18-45岁为青壮年;
rule "age_18_45"
activation-group "age_stage"
enabled true
when
input:com.ahao.project.input.UserIn(age >= 18 && age <= 45);
then
output.setAgeStages("青壮年");
end
// 46-69岁为中年;69岁以上为老年
rule "age_46_69"
activation-group "age_stage"
enabled true
when
input:com.ahao.project.input.UserIn(age >= 46 && age <= 69);
then
output.setAgeStages("中年");
end
// 69岁以上为老年
rule "age_69_999"
activation-group "age_stage"
enabled true
when
input:com.ahao.project.input.UserIn(age > 69);
then
output.setAgeStages("老年");
end
@Test
public void userDrl() {
// 获取规则文件
String drl = "";
try {
File file = ResourceUtils.getFile("classpath:drools/drl/user.drl");
FileReader fileReader = new FileReader(file);
BufferedReader reader = new BufferedReader(fileReader);
String s;
while ((s = reader.readLine()) != null) {
drl += s + "\n";
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
// 利用KieHelper工具类可以不通过kmodule.xml就可以实现规则
KieHelper kieHelper = new KieHelper();
// return new RuleBaseConfiguration();
// RuleBaseConfiguration对象,可用于在决策引擎中配置异常处理程序设置、多线程执行和顺序模式。
KieBaseConfiguration kieBaseConfiguration = kieHelper.ks.newKieBaseConfiguration();
// 默认处理异常的类
// kieBaseConfiguration.setOption(ConsequenceExceptionHandlerOption.get(DefaultConsequenceExceptionHandler.class));
// 启用多线程: 默认不开启
// kieBaseConfiguration.setOption(MultithreadEvaluationOption.NO);
// 启用顺序模式: 默认不开启
// Drools按照顺序执行规则一次,不会因为工作内存中的改变而再次执行规则。
// 这就意味着Drools忽略了规则中的insert,modify和update语句,以单个序列执行规则。
// 这个模式适合在无状态会话中使用。会让规则执行的更快
kieBaseConfiguration.setOption(SequentialOption.YES);
// ResourceType.DRL: 表示接受的规则文件类型
kieHelper.addContent(drl, ResourceType.DRL);
// 效验规则
Results verify = kieHelper.verify();
// 获取错误级别的编译日志
if (verify.hasMessages( Message.Level.ERROR )) {
log.error("规则编译失败:{}", messages);
} else {
KieBase kieBase = kieHelper.build(kieBaseConfiguration);
// 创建无状态的会话
StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();
// 创建规则输出对象
UserOut output = new UserOut();
statelessKieSession.setGlobal("output", output);
// 创建规则输入对象
UserIn input = new UserIn();
input.setAge(35);
// 执行规则
statelessKieSession.execute(input);
log.info("执行规则完毕,年龄:{},结果:{}",input.getAge(),output.getAgeStages());
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。