Drools 5 采用了原生的规则语言,那是一种非 XML 文本格式。在符号方面,这种格式是非常轻量的,它的应用非常简单。可以适用于比较复杂的业务逻辑,本例是用于计费系统的批价,粗略来说,有按次收费,按月收费,按照流量收费,又根据前提不同,使用不同的优惠策略,比如购买了某产品赠送800通话实践100分钟,又有可能根据当月实际使用天数赠送一定的通话时长。如此复杂场景使用规则引擎再好不过了,将动态的都用规则标识,模型里只存有静态数据。
首先Drools 规则要卸载drl 的文件里,通过程序加载这个drl,然后才可以运算
1. 引入jar包(maven 编译)
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>5.0.1</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>5.0.1</version>
</dependency>
2. 包装下drools
public class RuleRunner {
public RuleRunner() {
}
private static final String RULES_FILE="rules/charge.drl";
public void runRules(Object[] facts){
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
System.out.println( "Loading file: " + RULES_FILE );
kbuilder.add( ResourceFactory.newClassPathResource( RULES_FILE,RuleRunner.class ),ResourceType.DRL );
if (kbuilder.hasErrors() ) {
throw new ServiceException("charge.drl is a invalid rule file!");
}
Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
kbase.addKnowledgePackages( pkgs );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
for ( int i = 0; i < facts.length; i++ ) {
Object fact = facts[i];
System.out.println( "Inserting fact: " + fact );
ksession.insert( fact );
}
ksession.fireAllRules();
}
}
3. 调用这个封装进行异步的规则处理
Object[] facts={chargeRulesModel,chargePriceResult};
new RuleRunner().runRules(facts);
facts 就是要传入传出的对象。
4. 一个规则的解析
#created on: 2010-4-26
package charge
#list any import classes here.
import java.math.BigDecimal;
rule "rule_800yz:be707 -2" #800月租费优惠 规则头注释
when #条件
$chargeModel : ChargeRulesModel($pricePlan:pricePlan,$featureList:featureList,eval($pricePlan.getPricePlanMain().getRuleCode().equals("rule_800yz")),eval(String.valueOf($featureList.get("pp900_1000")).equals("10Express")))
$chargeResult : ChargePriceResult()
then # 执行逻辑
double price=$pricePlan.getCyclePolicy().getPrice();
int usage=(Integer)($featureList.get("pp900_61"));
int accountLength=(Integer)($featureList.get("pp900_59"));
int totalAccount=(Integer)($featureList.get("pp900_88"));
int preferValue= Integer.parseInt($pricePlan.getPreferentialPolicy().getPreferentValue());
##总使用量-赠送量>账期 则取账期的使用量作为使用天数
if(totalAccount- preferValue>= accountLength){ #使用类似java语言的判断逻辑
usage= accountLength;
}else{
usage = totalAccount- preferValue;
}
BigDecimal result= new BigDecimal(price*usage/accountLength);
$chargeResult.setAmount(result);
System.out.println("800月租费优惠");
end
主要包含注释,条件,要执行的业务,还可以写方法-也就相当于helper类,实际运行时会转化为java类,但是不建议这么写,你完全可以另外写个java类,这里调用就可以了。
到这里就可以完成你的drools 应用了,具体原理下回分解
分享到:
相关推荐
从基础讲起,结合应用场景,由浅到深细化讲解drools规则引擎的的相关知识,并结合具体实例,演示功能的使用和注意事项。后面通过搭建具体的项目并结合springboot框架联合使用Drools的相关知识包括决策表的使用,囊括...
规则引擎Drools使用手册(中文),对于学习和研究Drools技术很有帮助的~~
内容为PPt,演示java规则引擎Drools基础
Drools入门案例 Drools基础语法 规则属性 Drools高级语法 Spring整合Drools Spring Boot整合Drools ...对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下: 1、风险控制系统-
如果对drools还不是特别熟悉的,可以看下 《规则引擎Drools 之 初识drools》这篇文章; 本文源码,github 传送门:https://github.com/vincent9309/drools: 系统架构如下: 二、项目目录结构 三、...
规则引擎Drools在J2EE项目开发中的应用...
Drools 是一个基于Charles Forgy's的Rete算法的,专为Java语言所设计的规则引擎。Rete算法应用于面向对象的接口将使基于商业对象的商业规则的表达更为自然。Drools是用Java写的,但能同时运行在Java和.Net上。该文档...
很优秀的规则引擎,从java社区移植到.net平台上。
Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete 算法;提供了强大的Eclipse Plugin开发支持; 通过使用其中的DSL(Domain Specific Language),可以实现用自然语言方式来描述业务规则,使得业务分析...
规则引擎drools实例的使用,赶紧下载吧!
1 Drools简介1.1 Drools的作用1.2 使用规则引擎的优势1.3 规则引擎应用场景2 Drools初体验2.1 构建项目2.2 案例描述 2.3 代码实现3 Drools语法介绍3.1 规则文件的组成3.2 规则体语法结构3.3 Pattern模式匹配 ...
规则引擎drools讲义.html
规则引擎drools-guvnor的使用说明文档,便于规则引擎二次开发
规则引擎drools的学习文档,上手教程
Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需...
jboss 规则引擎 drools库。 api,core,compiler,jsr94 drools-compiler-5.1.1.jar
Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete算法;提供了强大的EclipsePlugin开发支持;通过使用其中的DSL(DomainSpecificLanguage),可以实现用自然语言方式来描述业务规则,使得业务分析人员也...
使用java规则引擎Drools自动排班前言
本人开发的一个drools小样例,基于drools6
Java规则引擎Drools简单探索,简单描写了Drools的应用场景及实例