drtools规则使用快速入门之一

来源:互联网 发布:mac怎么切换苹果系统 编辑:程序博客网 时间:2024/06/05 10:59

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.droolsimport com.feinno.drools.HelloWorldExample.ResultRate;rule "1"    dialect "mvel"when   m : ResultRate((faceStatus == -1 && tuStatus== -1 && status == -1 ), resultStatus : resultStatus )thenSystem.out.println( resultStatus );      modify ( m ) {      status = 1,      resultStatus = 0      };endrule "2"    dialect "mvel"when   m : ResultRate((faceStatus == 0 && tuStatus== 0 && status == -1 ), resultStatus : resultStatus )thenSystem.out.println( resultStatus );      modify ( m ) {      status = 1,      resultStatus = 0      };endrule "3"    dialect "mvel"when   m : ResultRate((faceStatus == 2 && tuStatus== 2&&tuProbability >= 0.85 && status == -1 ), resultStatus : resultStatus )thenSystem.out.println( resultStatus );      modify ( m ) {      status = 1,      resultStatus =1      };endrule "4"    dialect "mvel"when   m : ResultRate((faceStatus == 2 && tuStatus== 2&& tuProbability > 0.4 && tuProbability < 0.85 && probability>= 1.3 && status == -1 ), resultStatus : resultStatus )thenSystem.out.println( resultStatus );      modify ( m ) {      status = 1,      resultStatus =1      };endrule "5"    dialect "mvel"when   m : ResultRate((faceStatus == 2 && tuStatus== 2&& probability>= 0.8 && probability< 1.3 && status == -1 ), resultStatus : resultStatus )thenSystem.out.println( resultStatus );      modify ( m ) {      status = 9,      resultStatus = 2      };endrule "51"    dialect "mvel"when   m : ResultRate((faceStatus == 2 && tuStatus== 2&&tuProbability >= 0.85&& status == 9 ), resultStatus : resultStatus )thenSystem.out.println( resultStatus );      modify ( m ) {      status = 1,      resultStatus = 1      };endrule "6"    dialect "mvel"when   m : ResultRate((faceStatus == 2 && tuStatus== 2&& probability< 0.8 && status == -1 ), resultStatus : resultStatus )thenSystem.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


1 0
原创粉丝点击