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


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