drtools规则使用快速入门

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-08-08 20:59:49

drtools规则使用快速入门的相关文章

reStructuredText(.rst)语法规则快速入门

丑死人了,写了些东西,看今天是周末,就闲得打包上传到PyPI上,打包时反复测试,提示到没有README.rst, 就将原来的Readme.md 该为这个名了,结果上传上去,打开一看,天啊.一直很常见rst文件,得没怎么研究过,赶紧脑补. 该文章转载于: http://blog.useasp.net/archive/2014/09/05/rst-file-restructuredtext-markup-syntax-quikstart.aspx 这几天写了个Python的 模块,用Markdown

笔记:Spring Cloud Zuul 快速入门

Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了所有其他微服务的实例信息,这样的设计非常巧妙的将服务治理体系中维护的实例信息利用起来,使得维护服务实例的工作交给了服务治理框架自动完成,而对路由规则的维护,默认会将通过以服务名作为 ContextPath 的方式来创建路由映射,也可以做一些特别的配置,对于签名校验.登录校验等在微服务架构中的冗余问题

bash编程快速入门

首先,我们简单的介绍一下bash,bash是GNU计划编写的Unixshell,它是许多Linux平台上的内定shell,它提供了用户与系统的很好的交互,对于系统运维人员,bash的地位是举足轻重的,bash编程能很快处理日常的任务 bash入门,一个最简单的bash例子 #vim hello.sh #!/bin/bash #This is the first example of the bash #echo "Hello world" 下面,我们就这个简单的bash 脚本来介绍一下

定时器(Quartz)快速入门

Quartz概述 Quartz中的触发器 Quartz中提供了两种触发器,分别是CronTrigger和SimpleTrigger. SimpleTrigger 每 隔若干毫秒来触发纳入进度的任务.因此,对于夏令时来说,根本不需要做任何特殊的处理来"保持进度".它只是简单地保持每隔若干毫秒来触发一次,无论你的 SimpleTrigger每隔10秒触发一次还是每隔15分钟触发一次,还是每隔24小时触发一次. CronTrigger 在特定"格林日历"时刻触发纳入进程的

Netty5快速入门及实例视频教程(整合Spring)

Netty5快速入门及实例视频教程+源码(整合Spring) https://pan.baidu.com/s/1pL8qF0J 01.传统的Socket分析02.NIO的代码分析03.对于NIO的一些疑惑04.Netty服务端HelloWorld入门05.Netty服务端入门补充06.Netty客户端入门07.如何构建一个多线程NIO系统08.Netty源码分析一09.Netty源码分析二10.Netty5服务端入门案例11.Netty5客户端入门案例12.单客户端多连接程序13.Netty学习

Spring MVC 教程,快速入门,深入分析

资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 六.springMVC-mvc.xml 配置文件片段讲解 七.spring mvc 如何访问到静态的文件,如j

Yii2框架RESTful API教程(一) - 快速入门

前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RESTful的小伙伴快速入门. 一.目录结构 实现一个简单地RESTful API只需用到三个文件.目录如下: frontend ├─ config │ └ main.php ├─ controllers │ └ BookController.php └─ models └ Book.php 二.配置URL规则

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 Lex 与 Yacc 介绍 Lex 和 Yacc 是 UNIX 两个非常重要的.功能强大的工具.事实上,如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏.Ashish Bansal 为您详细的讨论了编写自己的语言和编译器所用到的这两种工具,包括常规表达式.声明.匹配模式.变量.Yacc 语法和解析器代码.最后,他解释了怎样把 Lex 和 Yacc 结合起来. 5 评论 Ashish Bansal ([ema

Spring_MVC_教程_快速入门_深入分析

Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明