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
- drtools规则使用快速入门之一
- Toad 使用快速入门之一
- Smarty快速入门之一
- RMAN之一:快速入门
- RMAN之一:快速入门
- JDBC之一:快速入门
- JDBC之一:快速入门
- SQL语言快速入门之一
- SQL语言快速入门之一
- JDBC之一:JDBC快速入门
- JDBC之一:JDBC快速入门
- Git使用入门之一
- reStructuredText(.rst)语法规则快速入门
- reStructuredText(.rst)语法规则快速入门
- MySQL快速入门03----字符集 & 校对规则
- reStructuredText(.rst)语法规则快速入门
- CSS设计规则BEM快速入门手册
- 时间序列规则法快速入门
- AS遇到问题与解决一
- gen already exists but is not a source folder. Convert to a source folder or rename it的错误。
- 几种撑开父类元素的方法
- 【旧代码整理】一个PHP操作mysql的class类
- ADB命令操作手机数据
- drtools规则使用快速入门之一
- tar打包排除某个或多个子目录 | AWK命令
- 剑指offer面试题18:树的子结构
- coin test
- [Cloud Computing]Mechanisms: Intrusion Detection and Prevention Systems
- BaseDao --- dao层的抽取
- mac下配置svn服务器详解及用户的权限管理
- 商品分类 商品类型 商品属性
- Java基础杂谈,考试前准备