標籤:
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
drtools規則使用快速入門