上一篇文章 http://blog.youkuaiyun.com/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