drools简单示例
来源:互联网 发布:凯文淘宝店 编辑:程序博客网 时间:2024/06/08 14:01
drools是一个规则引擎,可以将开发从业务中解放出来,不用重复写不同的业务、然后测试、上线,只需要将业务规则配置到drl文件,然后每次有新业务需求的时候,只需要改一下配置文件,项目不需要重新上线。drools帮你装载规则,解析规则,应用规则到你的业务。总之,使用drools你可以将业务规则的判定放在引擎里面去做,程序中只保留需要的业务数据。
比如抽奖,其实抽奖每次规则都是差不多的,无非就是换个规则,比如新手大礼包,过生日,过节,然后就是礼品的类目、数量会变化,我们将这些业务数据放到facet里面,然后将规则配置到drl文件中,然后每次修改drl规则文件,拿到刚才说的那些业务数据,利用drools装载的规则进行判断,看用户是否中奖。
这里提供一个例子,是活动相关的,根据数据的初始值匹配规则、执行规则、产生结果。
1.drl配置文件
package promotionRule;import mydrools.Promotion;rule step1 salience 100 lock-on-active true when $promotionRule : Promotion(getPurchaseNum()== 0&&getGoodsName()=="机油") then $promotionRule.setPurchaseNum($promotionRule.getPurchaseNum()+10); $promotionRule.recordPointLog("只要是机油,就买10件");endrule step2 salience 99 lock-on-active true when $promotionRule : Promotion(goodsPrice < 100) then $promotionRule.setPurchaseNum($promotionRule.getPurchaseNum()+50); $promotionRule.recordPointLog("价格小于100,就多买50件");endrule step3 //活动期限内,多买10件 salience 90 lock-on-active true date-effective "2017-01-08 23:59:59" date-expires "2017-08-08 23:59:59" when $promotionRule : Promotion(getPurchaseNum() < 1) then $promotionRule.setPurchaseNum($promotionRule.getPurchaseNum()+100); $promotionRule.recordPointLog("活动期限内,怎么着多买100件");end2.规则接口
public interface PromotionEngineRule { void initEngineRule(); void executeEngineRule(Promotion prmotion); void refreshEngineRule();}3.接口实现
public class PromotionEngineRuleImpl implements PromotionEngineRule {private KnowledgeBase knowledgeBase; @Override public void initEngineRule() { System.out.println(" init start....."); // 设置时间格式 System.setProperty("drools.dateformat", "yyyy-MM-dd HH:mm:ss"); knowledgeBase=getKnowledgeBase(); System.out.println(" init end"); } @Override public void executeEngineRule(Promotion promotion) { StatefulKnowledgeSession sessions= knowledgeBase.newStatefulKnowledgeSession(); sessions.insert(promotion); sessions.fireAllRules(new AgendaFilter() { @Override public boolean accept(Activation activation) { boolean result=false; if(activation.getRule().getName()!=null) { result= true; } return result; } }); sessions.dispose(); } @Override public void refreshEngineRule() { System.out.println("refresh start ..."); for(KnowledgePackage k:knowledgeBase.getKnowledgePackages()){ knowledgeBase.removeKnowledgePackage(k.getName()); } initEngineRule(); System.out.println("refresh end"); } public static KnowledgeBase getKnowledgeBase(){ List<String> paths=getRulePath(); KnowledgeBuilder builder= KnowledgeBuilderFactory.newKnowledgeBuilder(); for(String path:paths){ builder.add(ResourceFactory.newClassPathResource(path), ResourceType.DRL); } KnowledgeBuilderErrors errors=builder.getErrors(); if(errors.size()>0){ for(KnowledgeBuilderError error:errors){ System.out.println(error); } throw new IllegalArgumentException("can not parse knowledge"); } KnowledgeBase kbase= KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(builder.getKnowledgePackages()); return kbase; } public static List<String> getRulePath(){ List<String> paths= Lists.newArrayList(); paths.add("rules/promotionRule.drl"); return paths; }}4.测试
public class PromotionTest { public static void main(String[] args){ Promotion p=new Promotion(); PromotionEngineRule engine=new PromotionEngineRuleImpl(); p.setPurchaseNum(0); p.setGoodsName("机油"); p.setGoodsPrice(10); engine.initEngineRule(); engine.executeEngineRule(p); engine.refreshEngineRule(); }}
5.执行结果
init start.....16:01:52,049 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]…….. init end只要是机油,就买10件,已买数量10价格小于100,就多买50件,已买数量60活动期限内,怎么着多买100件,已买数量160refresh start ... init start..... init endrefresh end本文没有对drools语法做说明,不属于本文范围
0 0
- drools简单示例
- Drools简单例子
- 关于drools的简单笔记
- JBoss Drools 规则引擎示例程序
- Drools
- drools
- drools
- drools
- Drools
- drools
- Drools
- drools的简单demo-廉价房申请单
- 简单drools规则java代码自动生成
- eclipse+drools 6.5开发环境的搭建,以及创建一个简单的drools项目
- drools学习的一点理解,简单记录下
- 开源业务规则引擎JBoss Drools入门介绍 Demo示例
- JNDI简介&简单示例
- JNDI简介&简单示例
- JavaScript 以及javaquery 函数自动加载运行
- Android EventBus3.0实例使用详解及封装调用
- main function has more than 200 local variables
- ios 什么时候调用layoutSubviews
- java流代码笔记
- drools简单示例
- 495. Teemo Attacking
- Tomcat Manager配置访问主机及添加用户
- Kafka入门经典教程
- 查看端口占用常用的命令(记录)
- java笔记--关于线程同步(7种同步方式)
- git命令行使用
- JDK动态代理的实现及原理
- 编程基础题-2