1、前言
Drools(JBoss
Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。本文一个简单的例子讲解从java规则转化为规则引擎调用。
2、drtools规则
rule:定义一个规则。rule "ruleName"。一个规则可以包含三个部分:
属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。
条件部分,即LHS,定义当前规则的条件,如 when Message(); 判断当前workingMemory中是否存在Message对象。
结果部分,即RHS,这里可以写普通java代码,即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用。
规则事例:
详细文法见:http://www.360doc.com/content/07/0705/18/7147_596025.shtml
3、使用例子
3.1需要转化的java代码
public int statusProcess(int faceStatus, double faceProbability, int tuStatus, double tuProbability) { if (faceStatus == 0 || tuStatus == 0) { return 0; } if (faceStatus == 1 || tuStatus == 1) { return 0; } if (faceStatus == 2 && tuStatus == 2) { double probability = tuProbability + faceProbability; if (probability>0.85 && tuProbability >= 0.85) { return 1; } else if (tuProbability > 0.4 && tuProbability < 0.85 && probability >= 1.3) { return 1; } else if (probability >= 0.8 && probability < 1.3) { return 2; } else if (probability < 0.8) { return 0; } } return 2; }
3.2 对应的规则文件
package com.feinno.drools import com.feinno.drools.HelloWorldExample.ResultRate; rule "1" dialect "mvel" when m : ResultRate((faceStatus == -1 && tuStatus== -1 && status == -1 ), resultStatus : resultStatus ) then System.out.println( resultStatus ); modify ( m ) { status = 1, resultStatus = 0 }; end rule "2" dialect "mvel" when m : ResultRate((faceStatus == 0 && tuStatus== 0 && status == -1 ), resultStatus : resultStatus ) then System.out.println( resultStatus ); modify ( m ) { status = 1, resultStatus = 0 }; end rule "3" dialect "mvel" when m : ResultRate((faceStatus == 2 && tuStatus== 2&&tuProbability >= 0.85 && status == -1 ), resultStatus : resultStatus ) then System.out.println( resultStatus ); modify ( m ) { status = 1, resultStatus =1 }; end rule "4" dialect "mvel" when m : ResultRate((faceStatus == 2 && tuStatus== 2&& tuProbability > 0.4 && tuProbability < 0.85 && probability>= 1.3 && status == -1 ), resultStatus : resultStatus ) then System.out.println( resultStatus ); modify ( m ) { status = 1, resultStatus =1 }; end rule "5" dialect "mvel" when m : ResultRate((faceStatus == 2 && tuStatus== 2&& probability>= 0.8 && probability< 1.3 && status == -1 ), resultStatus : resultStatus ) then System.out.println( resultStatus ); modify ( m ) { status = 9, resultStatus = 2 }; end rule "51" dialect "mvel" when m : ResultRate((faceStatus == 2 && tuStatus== 2&&tuProbability >= 0.85&& status == 9 ), resultStatus : resultStatus ) then System.out.println( resultStatus ); modify ( m ) { status = 1, resultStatus = 1 }; end rule "6" dialect "mvel" when m : ResultRate((faceStatus == 2 && tuStatus== 2&& probability< 0.8 && status == -1 ), resultStatus : resultStatus ) then System.out.println( resultStatus ); modify ( m ) { status = 1, resultStatus = 0 }; end
注意:
1、规则不能嵌套
2、规则不支持a+b,增加一个中间变量probability
3.3 对应的java对象
public static class ResultRate{ int faceStatus; double faceProbability; int tuStatus; double tuProbability; int status; int resultStatus; double probability; public ResultRate(){ status = -1; } public int getFaceStatus() { return faceStatus; } public void setFaceStatus(int faceStatus) { this.faceStatus = faceStatus; } public double getFaceProbability() { return faceProbability; } public void setFaceProbability(double faceProbability) { this.faceProbability = faceProbability; } public int getTuStatus() { return tuStatus; } public void setTuStatus(int tuStatus) { this.tuStatus = tuStatus; } public double getTuProbability() { return tuProbability; } public void setTuProbability(double tuProbability) { this.tuProbability = tuProbability; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public int getResultStatus() { return resultStatus; } public void setResultStatus(int resultStatus) { this.resultStatus = resultStatus; } public double getProbability() { return probability; } public void setProbability(double probability) { this.probability = probability; } public void computeProbability(){ probability = faceProbability+tuProbability; } }
3.4 测试程序
public static void testRate()throws Exception { String filepath = "C:\\目标路径\\ResultRate.drl"; final Reader source = new FileReader(filepath); final PackageBuilder builder = new PackageBuilder(); //新建规则 builder.addPackageFromDrl(source); if (builder.hasErrors()) { System.out.println(builder.getErrors().toString()); throw new RuntimeException("Unable to compile ResultRate.drl"); } // get the compiled package (which is serializable) final Package pkg = builder.getPackage(); // add the package to a rulebase (deploy the rule package). final RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage(pkg); final StatefulSession session = ruleBase.newStatefulSession(); session.addEventListener(new DebugAgendaEventListener()); session.addEventListener(new DebugWorkingMemoryEventListener()); //测试 ResultRate rusultRate = new ResultRate(); rusultRate.setFaceStatus(2); rusultRate.setFaceProbability(0.3); rusultRate.setTuStatus(2); rusultRate.setTuProbability(0.90); rusultRate.computeProbability(); session.insert(rusultRate); session.fireAllRules(); System.out.println("======================================"); //规则库后测试 Package[] packs = ruleBase.getPackages(); for(int i = 0;i<packs.length;i++){ System.out.println(packs[i].getName()); ruleBase.removePackage(packs[i].getName()); } ResultRate rusultRate2 = new ResultRate(); rusultRate2.setFaceStatus(2); rusultRate2.setFaceProbability(0.3); rusultRate2.setTuStatus(2); rusultRate2.setTuProbability(0.90); rusultRate2.computeProbability(); System.out.println(rusultRate2.getResultStatus()); //消除相关的处理 session.dispose(); }
4、参考文档
http://blog.csdn.net/kevin_darkelf/article/details/50728137
http://www.360doc.com/content/07/0705/18/7147_596025.shtml
时间: 2024-10-13 01:05:48