规则引擎的优点
业务规则与系统代码分离,实现业务规则的集中管理
在不重启服务的情况下可随时对业务规则进行扩展和维护
可以动态修改业务规则,快速响应需求变更
减少了硬编码业务规则的成本和风险
使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单
规则引擎的应用场景
风险控制系统----风险贷款、风险评估
反欺诈项目----银行贷款、征信验证
决策平台系统----财务计算
促销平台系统----满减、打折、加价购其实业务逻辑判断较多的系统的都可以使用规则引擎。
规则文件的位置:
必须在resource下面且以drl后缀
规则文件重要组成
关键字 | 说明 | |
package | 包名 | |
import | 引入业务实体类 | |
rule | 规则体 |
规则体要求:
when条件后面没有任何标点符号
then 后面每一条都必须要加分号表示结束
规则体语法:
rule 规则名称【保证唯一】
when
【业务规则条件】
then
【输出】;
end
错误实例一:多余括号
rule "rule_2"
when
$store: (Order(amount >=100) && Order(amount <=500))
then
$store.setScore(100);
System.out.println("消费100元-500元 加100积分 ");
end
错误实例二: 每行结束未加分号
rule "rule_3"
when
$store:(Order(amount >=500) && Order(amount <=1000))
then
$store.setScore(500)
System.out.println("消费500元-1000元 加500积分 ")
end
正确写法:
错误一的正确写法如下两种
rule "rule_2"
when
$store: Order(amount >=100) && Order(amount <=500)
then
$store.setScore(100);
System.out.println("消费100元-500元 加100积分 ");
end
rule "rule_2"
when
$store: Order(amount >=100) && Order(amount <=500)
then
$store.setScore(100);
System.out.println("消费100元-500元 加100积分 ");
end
错误二的正确写法
rule "rule_3"
when
$store:Order(amount>500 && amount<=1000)
then
$store.setScore(500);
System.out.println("消费500元-1000元 加500积分 ");
end
如果规则文件有问题,则项目启动报如下错误:
报drools.compiler.kie.builder.impl.InternalKieModule编译不通过
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.kie.api.runtime.KieContainer]: Factory method 'kieContainer' threw exception; nested exception is java.lang.ClassCastException: com.drools.conf.DroolsConfig$$Lambda$584/310792845 cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.22.jar:5.3.22]
... 85 common frames omitted
Caused by: java.lang.ClassCastException: com.drools.conf.DroolsConfig$$Lambda$584/310792845 cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule
at org.drools.compiler.kie.builder.impl.KieServicesImpl.newKieContainer(KieServicesImpl.java:184) ~[drools-compiler-7.6.0.Final.jar:7.6.0.Final]
a