zoukankan      html  css  js  c++  java
  • zbb20170605 Drools java 规则引擎

    总体视图

    http://pan.baidu.com/disk/home?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0#list/path=%2F%E9%87%91%E5%B1%B1%E5%BF%AB%E7%9B%98%E6%96%87%E4%BB%B6%2F%E5%BF%AB%E7%9B%98%2F%E6%88%91%E7%9A%84%E8%B5%84%E6%96%99%2F%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6%2F%E5%B8%B8%E7%94%A8%E4%BB%A3%E7%A0%81%E6%95%B4%E5%90%88%E4%BF%AE%E6%95%B4%2FDrools&vmode=grid

    Test.java

    package com.zbb.drools;
    import java.util.Scanner;
    public class Test {
    	public static void main(String[] args) {
    		PointRuleEngineImp pointRuleEngineImp = new PointRuleEngineImp();
    		PointDomain domain = new PointDomain();
    		while (true) {
    			Scanner scanner = new Scanner(System.in);
    			String nextLine = scanner.nextLine();
    			if ("s".equals(nextLine)) {
    				System.out.println("初始化规则引擎...");
    				pointRuleEngineImp.initEngine();
    				System.out.println("初始化规则引擎结束.");
    			} else if ("e".equals(nextLine)) {
    				domain.setBuyNums(5);
    				System.out.println(domain.getPoint());
    				pointRuleEngineImp.executeEngine(domain);
    				System.out.println(domain.getPoint());
    			} else {
    				System.out.println("非法输入!");
    			}
    		}
    	}
    }
    

     RuleBaseFacatory.java

    package com.zbb.drools;
    
    import org.drools.RuleBase;
    import org.drools.RuleBaseFactory;
    
    /**
     * RuleBaseFacatory 单实例RuleBase生成工具
     * @author quzishen
     */
    public class RuleBaseFacatory {
    	private static RuleBase ruleBase;
    	
    	public static RuleBase getRuleBase(){
    		return null != ruleBase ? ruleBase : RuleBaseFactory.newRuleBase();
    	}
    }
    

     PointRuleEngineImp.java

    package com.zbb.drools;
    
    import org.drools.RuleBase;
    import org.drools.StatefulSession;
    import org.drools.compiler.PackageBuilder;
    import org.drools.spi.Activation;
    import org.drools.spi.AgendaFilter;
    
    public class PointRuleEngineImp implements PointRuleEngine{
    	private RuleBase ruleBase;
    	@Override
    	public void initEngine() {
    		// TODO Auto-generated method stub
    		//设置事件格式
    		System.setProperty("drools.dateformat","yyyy-MM-dd HH:mm:ss");
    		ruleBase=RuleBaseFacatory.getRuleBase();
    		try {
    			PackageBuilder packageBuilderFromDrlFile = DroolsUtil.getPackageBuilderFromDrlFile();
    			ruleBase.addPackage(packageBuilderFromDrlFile.getPackage());
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		};
    		
    		
    	}
    
    	@Override
    	public void refreshEngine() {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void executeEngine(final PointDomain pointDomain) {
    		// TODO Auto-generated method stub
    		if(null==ruleBase){
    			return ;
    		}
    		StatefulSession session = ruleBase.newStatefulSession();
    		session.insert(pointDomain);
    		session.fireAllRules(new AgendaFilter() {
    			@Override
    			public boolean accept(Activation arg0) {
    				// TODO Auto-generated method stub
    				return !arg0.getRule().getName().contains("_test");
    				
    			}
    		});
    		session.dispose();
    	}
    	
    }
    

     PointRuleEngine.java

    package com.zbb.drools;
    
    public interface PointRuleEngine {
    	public void initEngine();
    	public void refreshEngine();
    	public void executeEngine(final PointDomain pointDomain);
    }
    

     PointDomain.java

    package com.zbb.drools;
    public class PointDomain {
    	private String userName;
    	private int account;
    	private int buyNums;
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public int getAccount() {
    		return account;
    	}
    	public void setAccount(int account) {
    		this.account = account;
    	}
    	public int getBuyNums() {
    		return buyNums;
    	}
    	public void setBuyNums(int buyNums) {
    		this.buyNums = buyNums;
    	}// 增加积分数目
    	private long point;
    	public long getPoint() {
    		return point;
    	}
    	public void setPoint(long point) {
    		this.point = point;
    	}
    	/**
    	 * 记录积分发送流水,防止重复发放
    	 * 
    	 * @param userName
    	 *            用户名
    	 * @param type
    	 *            积分发放类型
    	 */
    	public void recordPointLog(String userName, String type) {
    		System.out.println("增加对" + userName + "的类型为" + type + "的积分操作记录.");
    	}
    }
    

     DroolsUtil.java

    package com.zbb.drools;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.List;
    import org.drools.compiler.PackageBuilder;
    public class DroolsUtil {
    	/**
    	 * 从drl规则文件中读取规则
    	 * 
    	 * @throws FileNotFoundException
    	 */
    	public static PackageBuilder getPackageBuilderFromDrlFile() throws Exception {
    		// 获取脚本文件
    		List<String> drlFile = getDrlFile();
    		// 装载脚本文件
    		List<Reader> readRuleFromDrlFile = readRuleFromDrlFile(drlFile);
    		PackageBuilder builder = new PackageBuilder();
    		for (Reader reader : readRuleFromDrlFile) {
    			builder.addPackageFromDrl(reader);
    		}
    		if (builder.hasErrors()) {
    			throw new Exception(builder.getErrors().toString());
    		}
    		return builder;
    	}
    	/**
    	 * 装载脚本文件
    	 * 
    	 * @throws FileNotFoundException
    	 */
    	private static List<Reader> readRuleFromDrlFile(List<String> drlFile) throws FileNotFoundException {
    		if (null == drlFile || drlFile.size() == 0) {
    			return null;
    		}
    		List<Reader> readers = new ArrayList<>();
    		for (String ss : drlFile) {
    			readers.add(new FileReader(new File(ss)));
    		}
    		return readers;
    	}
    	/**
    	 * 获取规则文件
    	 */
    	private static List<String> getDrlFile() {
    		List<String> drlFilePath = new ArrayList<String>();
    		drlFilePath.add(getPath() + "/src/com/zbb/drools/drl/addpoint.drl");
    		// drlFilePath.add("E:/azz/drools/drl/subpoint.drl");
    		return drlFilePath;
    	}
    	/**
    	 * 获取项目路径
    	 * 
    	 * @return
    	 */
    	public static String getPath() {
    		File file = new File("");
    		System.out.println(file.getAbsolutePath());
    		try {
    			System.out.println(file.getCanonicalPath());
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return file.getAbsolutePath();
    	};
    }
    

     addpoint.drl

    package com.zbb.drools
    import com.zbb.drools.PointDomain;
    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 buyNumsPoint2
    	// 当月购物次数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
    
  • 相关阅读:
    Java自学-I/O File类
    Java自学-异常处理 自定义异常
    Java自学-异常处理 Throwable
    Java自学-异常处理 异常分类
    Java自学-异常处理 处理
    Java自学-异常处理 Exception
    Java自学-日期 Calendar
    Java自学-日期 日期格式化
    Java自学-日期 Date
    Java自学-数字与字符串 MyStringBuffer
  • 原文地址:https://www.cnblogs.com/super-admin/p/6945135.html
Copyright © 2011-2022 走看看