Drools的JSR94实现形式

最近在研究规则引擎的东东。网上找了下,单说drools的文章不少,单独讲JSR94的文章并不多见。现把drools的JSR写法整理发上来,供自己记录,供大家参考。

 

调用入口:JSR94Sample.java

 

package info.syang.stu1;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.rmi.RemoteException;
import java.util.Arrays;
import java.util.HashMap;

import javax.rules.ConfigurationException;
import javax.rules.InvalidRuleSessionException;
import javax.rules.RuleExecutionSetNotFoundException;
import javax.rules.RuleRuntime;
import javax.rules.RuleServiceProvider;
import javax.rules.RuleServiceProviderManager;
import javax.rules.RuleSessionCreateException;
import javax.rules.RuleSessionTypeUnsupportedException;
import javax.rules.StatelessRuleSession;
import javax.rules.admin.LocalRuleExecutionSetProvider;
import javax.rules.admin.RuleAdministrator;
import javax.rules.admin.RuleExecutionSet;
import javax.rules.admin.RuleExecutionSetCreateException;
import javax.rules.admin.RuleExecutionSetRegisterException;

import org.drools.jsr94.rules.RuleServiceProviderImpl;


/**
 * Drools的JSR94实现形式
 * @author yangsong
 *
 */
public class JSR94Sample {
    private RuleServiceProvider ruleProvider;
    public void run(){
        String uri = RuleServiceProviderImpl.RULE_SERVICE_PROVIDER;
        try{
            //1.注册ruleProvider,并且从RuleServiceProviderManager获取ruleProvider
            RuleServiceProviderManager.registerRuleServiceProvider(uri, RuleServiceProviderImpl.class);
            ruleProvider = RuleServiceProviderManager.getRuleServiceProvider(uri);
            
            HashMap<String,String> properties = new HashMap<String,String>();
            
            //2.获取RuleAdministrator实例,获取RuleExectuionSetProvider
            RuleAdministrator admin = ruleProvider.getRuleAdministrator();
            LocalRuleExecutionSetProvider ruleExecutionSetProvider = admin.getLocalRuleExecutionSetProvider(properties);
            
            //3.创建RuleExecutionSet
            Reader reader = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("info/syang/stu1/addpoint.drl"));
            RuleExecutionSet reSet = ruleExecutionSetProvider.createRuleExecutionSet(reader, properties);
            
            //4.注册RuleExecutionSet
            admin.registerRuleExecutionSet("mysample",reSet,properties);
            
            
            //5.获取RuleRuntime, 创建会话
            RuleRuntime runtime = ruleProvider.getRuleRuntime();
            StatelessRuleSession ruleSession = (StatelessRuleSession)runtime.createRuleSession("mysample",null,RuleRuntime.STATELESS_SESSION_TYPE);

            //6.运行实例
            PointDomain pointDomain = new PointDomain();
            fillPointDomain(pointDomain);
            
            ruleSession.executeRules(Arrays.asList(pointDomain));
//            @SuppressWarnings("unchecked")
//			List<PointDomain> results = (List<PointDomain>)ruleSession.executeRules(Arrays.asList(pointDomain));
            
			System.out.println("执行完毕BillThisMonth:"+ pointDomain.getBillThisMonth());
			System.out.println("执行完毕BuyMoney:" + pointDomain.getBuyMoney());
			System.out.println("执行完毕BuyNums:" + pointDomain.getBuyNums());

			System.out.println("执行完毕规则引擎决定发送积分:" + pointDomain.getPoint());
            
        }catch(ConfigurationException e){
            e.printStackTrace();
        } catch (RemoteException e) {
			e.printStackTrace();
		} catch (RuleExecutionSetCreateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (RuleExecutionSetRegisterException e) {
			e.printStackTrace();
		} catch (RuleSessionTypeUnsupportedException e) {
			e.printStackTrace();
		} catch (RuleSessionCreateException e) {
			e.printStackTrace();
		} catch (RuleExecutionSetNotFoundException e) {
			e.printStackTrace();
		} catch (InvalidRuleSessionException e) {
			e.printStackTrace();
		}
    }
    
    private void fillPointDomain(PointDomain pointDomain){
		pointDomain.setUserName("hello kity");
		pointDomain.setBackMondy(100d);
		pointDomain.setBuyMoney(500d);
		pointDomain.setBackNums(1);
		pointDomain.setBuyNums(5);
		pointDomain.setBillThisMonth(5);
		pointDomain.setBirthDay(true);
		pointDomain.setPoint(0l);
    }
    
    
	public static void main(String...strings ){
		new JSR94Sample().run();
	}
}

 积分计算对象:PointDomain.java

 

 

package info.syang.stu1;

/**
 * 积分计算对象
 * @author yangsong
 *
 */
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

//created on: 2014-1-8
import info.syang.stu1.PointDomain;

rule birthdayPoint
	// 过生日,则加10分,并且将当月交易比数翻倍后再计算积分
	salience 100
	lock-on-active true
	when
		$pointDomain : PointDomain(birthDay == true)
	then
		$pointDomain.setPoint($pointDomain.getPoint()+10);
		$pointDomain.setBuyNums($pointDomain.getBuyNums()*2);
		$pointDomain.setBuyMoney($pointDomain.getBuyMoney()*2);
		$pointDomain.setBillThisMonth($pointDomain.getBillThisMonth()*2);
		
		$pointDomain.recordPointLog($pointDomain.getUserName(),"birthdayPoint");
end

rule billThisMonthPoint
	// 2011-01-08 - 2011-08-08每月信用卡还款3次以上,每满3笔赠送30分
	salience 99
	lock-on-active true
	when
		$pointDomain : PointDomain(billThisMonth >= 3)
	then
		$pointDomain.setPoint($pointDomain.getPoint()+$pointDomain.getBillThisMonth()/3*30);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"billThisMonthPoint");
end

rule buyMoneyPoint
	// 当月购物总金额100以上,每100元赠送10分
	salience 98
	lock-on-active true
	when
		$pointDomain : PointDomain(buyMoney >= 100)
	then
		$pointDomain.setPoint($pointDomain.getPoint()+ (int)$pointDomain.getBuyMoney()/100 * 10);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"buyMoneyPoint");
end

rule buyNumsPoint
	// 当月购物次数5次以上,每五次赠送50分
	salience 97
	lock-on-active true
	when
		$pointDomain : PointDomain(buyNums >= 5)
	then
		$pointDomain.setPoint($pointDomain.getPoint()+$pointDomain.getBuyNums()/5 * 50);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"buyNumsPoint");
end

rule allFitPoint
	// 特别的,如果全部满足了要求,则额外奖励100分
	salience 96
	lock-on-active true
	when
		$pointDomain:PointDomain(buyNums >= 5 && billThisMonth >= 3 && buyMoney >= 100)
	then
		$pointDomain.setPoint($pointDomain.getPoint()+ 100);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"allFitPoint");
end

 

 

 参考文章:

http://thinkinside.tk/2012/12/07/jsr94.html

http://blog.csdn.net/quzishen/article/details/6163012

 

我这里收集了一些drools的学习材料,贴上来供有需要的同学参考

http://www.360doc.com/content/06/1010/16/11884_227032.shtml

http://www.360doc.com/content/10/0301/11/871184_17184008.shtml

http://liureying.blog.163.com/blog/static/6151352011111391336589/

http://liureying.blog.163.com/blog/static/615135201111394058945/

http://www.360doc.com/content/11/0314/15/3303212_101031357.shtml

http://thinkinside.tk/2012/12/06/rule_language.html

http://blog.csdn.net/joeyshi/article/details/4146992

http://blog.sina.com.cn/s/blog_4a7a7aa30100089g.html

你可能感兴趣的:(Drools的JSR94实现形式)