上一篇文章 http://blog.csdn.net/decaizhang/article/details/6718537 描述了一些常用的drools的語法標籤和一個模擬實例即發送積分的場景,這一片優化了一下代碼,在此貼一下,希望有這方面使用經驗的朋友多多交流溝通,指正不足。
通常而言,習慣上我們將規則放到文件系統中,比如以drl結尾的規則文件,現在我們要擴充一下,使其放到數據庫中,以供多臺服務器同時使用,同時依然保留文件系統的支持。
先看下一個接口:
- /**
- * 規則接口
- * @author quzishen
- */
- public interface PointRuleEngine {
- /**
- * 初始化規則引擎
- */
- public void initEngine();
- /**
- * 刷新規則引擎中的規則
- */
- public void refreshEnginRule();
- /**
- * 執行規則引擎
- * @param pointDomain 積分Fact
- */
- public void executeRuleEngine(final PointDomain pointDomain);
- }
實現過程沒有任何難度,兩種方式封裝過程只在於讀取規則的方式不同,代碼很簡單:
其中的getRuleFromDB() 和 getRuleDrlFile() 兩個方法即可以重寫以接入個人系統,現在其中編寫的是測試代碼。
其他的文件與上篇文章相同:
RuleBaseFacatory
DroolsRuleDomain
PointDomain
- package com.drools.demo.point;
- /**
- * 積分計算對象
- * @author quzishen
- */
- public class PointDomain {
- // 用戶名
- private String userName;
- // 是否當日生日
- private boolean birthDay;
- // 增加積分數目
- private long point;
- // 當月購物次數
- private int buyNums;
- // 當月退貨次數
- private int backNums;
- // 當月購物總金額
- private double buyMoney;
- // 當月退貨總金額
- private double backMondy;
- // 當月信用卡還款次數
- private int billThisMonth;
- /**
- * 記錄積分發送流水,防止重複發放
- * @param userName 用戶名
- * @param type 積分發放類型
- */
- public void recordPointLog(String userName, String type){
- System.out.println("增加對"+userName+"的類型爲"+type+"的積分操作記錄.");
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public boolean isBirthDay() {
- return birthDay;
- }
- public void setBirthDay(boolean birthDay) {
- this.birthDay = birthDay;
- }
- public long getPoint() {
- return point;
- }
- public void setPoint(long point) {
- this.point = point;
- }
- public int getBuyNums() {
- return buyNums;
- }
- public void setBuyNums(int buyNums) {
- this.buyNums = buyNums;
- }
- public int getBackNums() {
- return backNums;
- }
- public void setBackNums(int backNums) {
- this.backNums = backNums;
- }
- public double getBuyMoney() {
- return buyMoney;
- }
- public void setBuyMoney(double buyMoney) {
- this.buyMoney = buyMoney;
- }
- public double getBackMondy() {
- return backMondy;
- }
- public void setBackMondy(double backMondy) {
- this.backMondy = backMondy;
- }
- public int getBillThisMonth() {
- return billThisMonth;
- }
- public void setBillThisMonth(int billThisMonth) {
- this.billThisMonth = billThisMonth;
- }
- }
addpoint.drl
subpoint.drl 與上一篇相同,請參見上一篇,此處省略篇幅略
測試代碼
Test