免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2826 | 回复: 0
打印 上一主题 下一主题

规则引擎 Drools 使用解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-09 07:22 |只看该作者 |倒序浏览
Drools 5 采用了原生的规则语言,那是一种非 XML 文本格式。在符号方面,这种格式是非常轻量的,它的应用非常简单。可以适用于比较复杂的业务逻辑,本例是用于计费系统的批价,粗略来说,有按次收费,按月收费,按照流量收费,又根据前提不同,使用不同的优惠策略,比如购买了某产品赠送800通话实践100分钟,又有可能根据当月实际使用天数赠送一定的通话时长。如此复杂场景使用规则引擎再好不过了,将动态的都用规则标识,模型里只存有静态数据。

  首先Drools 规则要卸载drl 的文件里,通过程序加载这个drl,然后才可以运算



  1. 引入jar包(maven 编译)
  1.   <dependency>
  2.       <groupId>org.drools</groupId>
  3.       <artifactId>drools-core</artifactId>
  4.       <version>5.0.1</version>
  5.     </dependency>
  6.     <dependency>
  7.       <groupId>org.drools</groupId>
  8.       <artifactId>drools-compiler</artifactId>
  9.       <version>5.0.1</version>
  10.     </dependency>
复制代码
2. 包装下drools
  1. public class RuleRunner {
  2.        
  3.         public RuleRunner() {
  4.     }
  5.         private static final String RULES_FILE="rules/charge.drl";
  6.        
  7.             public void runRules(Object[] facts){

  8.                 KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
  9.                 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
  10.                 System.out.println( "Loading file: " + RULES_FILE );
  11.                 kbuilder.add( ResourceFactory.newClassPathResource( RULES_FILE,RuleRunner.class ),ResourceType.DRL );
  12.                 if (kbuilder.hasErrors() ) {
  13.                     throw new ServiceException("charge.drl is a invalid rule file!");
  14.                 }
  15.                 Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
  16.                 kbase.addKnowledgePackages( pkgs );
  17.                 StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
  18.                 for ( int i = 0; i < facts.length; i++ ) {
  19.                     Object fact = facts[i];
  20.                     System.out.println( "Inserting fact: " + fact );
  21.                     ksession.insert( fact );
  22.                 }
  23.                 ksession.fireAllRules();
  24.             }
  25.         }
复制代码
3. 调用这个封装进行异步的规则处理
  1. Object[] facts={chargeRulesModel,chargePriceResult};
  2.         new RuleRunner().runRules(facts);
复制代码
facts 就是要传入传出的对象。

4. 一个规则的解析
  1. #created on: 2010-4-26
  2. package charge

  3. #list any import classes here.
  4. import java.math.BigDecimal;

  5. rule "rule_800yz:be707 -2" #800月租费优惠<SPAN style="COLOR: #ff0000"> 规则头注释</SPAN>
  6.         when   <SPAN style="COLOR: #ff0000">#条件</SPAN>
  7.                 $chargeModel : ChargeRulesModel($pricePlan:pricePlan,$featureList:featureList,eval($pricePlan.getPricePlanMain().getRuleCode().equals("rule_800yz")),eval(String.valueOf($featureList.get("pp900_1000")).equals("10Express")))
  8.                 $chargeResult : ChargePriceResult()
  9.         then    <SPAN style="COLOR: #ff0000"># 执行逻辑</SPAN>
  10.         double price=$pricePlan.getCyclePolicy().getPrice();
  11.           int usage=(Integer)($featureList.get("pp900_61"));
  12.           int accountLength=(Integer)($featureList.get("pp900_59"));
  13.           int totalAccount=(Integer)($featureList.get("pp900_88"));
  14.           int preferValue= Integer.parseInt($pricePlan.getPreferentialPolicy().getPreferentValue());
  15.           ##总使用量-赠送量>账期     则取账期的使用量作为使用天数
  16.           if(totalAccount- preferValue>= accountLength){ <SPAN style="COLOR: #ff0000">#使用类似java语言的判断逻辑</SPAN>
  17.                   usage=  accountLength;
  18.           }else{
  19.                   usage = totalAccount- preferValue;
  20.           }
  21.           BigDecimal result=  new BigDecimal(price*usage/accountLength);
  22.           $chargeResult.setAmount(result);
  23.           System.out.println("800月租费优惠");
  24. end
复制代码
主要包含注释,条件,要执行的业务,还可以写方法-也就相当于helper类,实际运行时会转化为java类,但是不建议这么写,你完全可以另外写个java类,这里调用就可以了。



    到这里就可以完成你的drools 应用了,具体原理下回分解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP