博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Drools的JSR94实现形式
阅读量:7003 次
发布时间:2019-06-27

本文共 8119 字,大约阅读时间需要 27 分钟。

hot3.png

最近在研究规则引擎的东东。网上找了下,单说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
properties = new HashMap
(); //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
results = (List
)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-8import 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");endrule 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");endrule 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");endrule 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");endrule 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

转载于:https://my.oschina.net/skymozn/blog/504963

你可能感兴趣的文章