JAVA规则引擎2 -- Drools实例

上一篇文章 http://blog.csdn.net/decaizhang/article/details/6718537 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的场景,这一片优化了一下代码,在此贴一下,希望有这方面使用经验的朋友多多交流沟通,指正不足。

通常而言,习惯上我们将规则放到文件系统中,比如以drl结尾的规则文件,现在我们要扩充一下,使其放到数据库中,以供多台服务器同时使用,同时依然保留文件系统的支持。

先看下一个接口:

  1. /** 
  2.  * 规则接口 
  3.  * @author quzishen 
  4.  */  
  5. public interface PointRuleEngine {  
  6.       
  7.     /** 
  8.      * 初始化规则引擎 
  9.      */  
  10.     public void initEngine();  
  11.       
  12.     /** 
  13.      * 刷新规则引擎中的规则 
  14.      */  
  15.     public void refreshEnginRule();  
  16.       
  17.     /** 
  18.      * 执行规则引擎 
  19.      * @param pointDomain 积分Fact 
  20.      */  
  21.     public void executeRuleEngine(final PointDomain pointDomain);  
  22. }  

实现过程没有任何难度,两种方式封装过程只在于读取规则的方式不同,代码很简单:

其中的getRuleFromDB() 和 getRuleDrlFile() 两个方法即可以重写以接入个人系统,现在其中编写的是测试代码。

其他的文件与上篇文章相同:

 

RuleBaseFacatory

DroolsRuleDomain

PointDomain

  1. package com.drools.demo.point;  
  2.   
  3.   
  4. /** 
  5.  * 积分计算对象 
  6.  * @author quzishen 
  7.  */  
  8. public class PointDomain {  
  9.     // 用户名  
  10.     private String userName;  
  11.     // 是否当日生日  
  12.     private boolean birthDay;  
  13.     // 增加积分数目  
  14.     private long point;  
  15.     // 当月购物次数  
  16.     private int buyNums;  
  17.     // 当月退货次数  
  18.     private int backNums;  
  19.     // 当月购物总金额  
  20.     private double buyMoney;  
  21.     // 当月退货总金额  
  22.     private double backMondy;  
  23.     // 当月信用卡还款次数  
  24.     private int billThisMonth;  
  25.       
  26.     /** 
  27.      * 记录积分发送流水,防止重复发放 
  28.      * @param userName 用户名 
  29.      * @param type 积分发放类型 
  30.      */  
  31.     public void recordPointLog(String userName, String type){  
  32.         System.out.println("增加对"+userName+"的类型为"+type+"的积分操作记录.");  
  33.     }  
  34.   
  35.     public String getUserName() {  
  36.         return userName;  
  37.     }  
  38.   
  39.     public void setUserName(String userName) {  
  40.         this.userName = userName;  
  41.     }  
  42.   
  43.     public boolean isBirthDay() {  
  44.         return birthDay;  
  45.     }  
  46.   
  47.     public void setBirthDay(boolean birthDay) {  
  48.         this.birthDay = birthDay;  
  49.     }  
  50.   
  51.     public long getPoint() {  
  52.         return point;  
  53.     }  
  54.   
  55.     public void setPoint(long point) {  
  56.         this.point = point;  
  57.     }  
  58.   
  59.     public int getBuyNums() {  
  60.         return buyNums;  
  61.     }  
  62.   
  63.     public void setBuyNums(int buyNums) {  
  64.         this.buyNums = buyNums;  
  65.     }  
  66.   
  67.     public int getBackNums() {  
  68.         return backNums;  
  69.     }  
  70.   
  71.     public void setBackNums(int backNums) {  
  72.         this.backNums = backNums;  
  73.     }  
  74.   
  75.     public double getBuyMoney() {  
  76.         return buyMoney;  
  77.     }  
  78.   
  79.     public void setBuyMoney(double buyMoney) {  
  80.         this.buyMoney = buyMoney;  
  81.     }  
  82.   
  83.     public double getBackMondy() {  
  84.         return backMondy;  
  85.     }  
  86.   
  87.     public void setBackMondy(double backMondy) {  
  88.         this.backMondy = backMondy;  
  89.     }  
  90.   
  91.     public int getBillThisMonth() {  
  92.         return billThisMonth;  
  93.     }  
  94.   
  95.     public void setBillThisMonth(int billThisMonth) {  
  96.         this.billThisMonth = billThisMonth;  
  97.     }  
  98.   
  99. }  

addpoint.drl

subpoint.drl 与上一篇相同,请参见上一篇,此处省略篇幅略

测试代码

Test


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章