最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎。兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎,被广泛的应用在各个领域,如JBPM也是基于Drools的。一般我们使用规则 引擎的前提和场景是:业务规则频繁变化!如果业务规则稳定则无需应用规则引擎的,实际中诸如移动通信商、银行等领域则广泛的使用了规则引擎,主要是为了适 应频繁变更的规则,但又不需要影响业务逻辑代码。

在看了官方的一些文档介绍后,通过一个例子体验了下Drools,例子说明如下:

1、小明手上有50元钱;

2、1元钱可以买一瓶饮料;

3、2个空瓶可以兑换一瓶饮料;

4、问题是:最终小明可以喝多少瓶饮料;

通过Drools的规则推理引擎可以很好的解决这类问题,至于搭建Drools的开发环境就不细说了。直接上代码说明:

一、规则fact

 package com.nonbankcard.drools.jisuan;
/**
* 事实
* @author sxf
*
*/
public class User {
private int money; // 手中的钱
private int kp; // 空瓶数
private int totals; // 喝掉的瓶数
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public int getKp() {
return kp;
}
public void setKp(int kp) {
this.kp = kp;
}
public int getTotals() {
return totals;
}
public void setTotals(int totals) {
this.totals = totals;
} }

二、测试规则的代码

 package com.nonbankcard.drools.jisuan;

 import java.util.Iterator;

 import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
/**
* 测试规则的代码
* @author sxf
*
*/
public class DroolsTester { public static void main(String[] args) throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("user.drl"), ResourceType.DRL);
if (kbuilder.hasErrors()) {
System.out.println("规则错误:");
Iterator<KnowledgeBuilderError> it = kbuilder.getErrors().iterator();
while (it.hasNext()) System.out.println(it.next());
return;
}
KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase();
kb.addKnowledgePackages(kbuilder.getKnowledgePackages());
StatefulKnowledgeSession s = kb.newStatefulKnowledgeSession();
User user=new User();
user.setMoney(50);
s.insert(user);
s.fireAllRules();
s.dispose();
} }

三、规则文件

 package cc.mzone

 //list any import classes here.
import com.nonbankcard.drools.jisuan.User; //declare any global variables here // 规则1,如果有钱就买一瓶喝掉
rule "r001"
salience 3
when
$u:User(money>0);
then
System.out.println("余钱:" + $u.getMoney() + ",花1元购买1瓶并喝掉");
$u.setKp($u.getKp() + 1);
$u.setMoney($u.getMoney() - 1);
$u.setTotals($u.getTotals() + 1);
update($u);
end // 规则2,如果空瓶数大于2则换购1瓶(兑换成1元钱)
rule "r002"
salience 2
when
$u:User(kp>=2);
then
System.out.println("空瓶数:" + $u.getKp() + ",兑换2个空瓶为1元钱");
$u.setKp($u.getKp() - 2);
$u.setMoney($u.getMoney() + 1);
update($u);
end // 规则3,打印已经喝掉的数量
rule "r003"
salience 1
when
$u:User();
then
System.out.println("总喝掉瓶数:" + $u.getTotals());
end

四:测试结果输出

 余钱:50,花1元购买1瓶并喝掉
余钱:49,花1元购买1瓶并喝掉
余钱:48,花1元购买1瓶并喝掉
余钱:47,花1元购买1瓶并喝掉
余钱:46,花1元购买1瓶并喝掉
余钱:45,花1元购买1瓶并喝掉
余钱:44,花1元购买1瓶并喝掉
余钱:43,花1元购买1瓶并喝掉
余钱:42,花1元购买1瓶并喝掉
余钱:41,花1元购买1瓶并喝掉
余钱:40,花1元购买1瓶并喝掉
余钱:39,花1元购买1瓶并喝掉
余钱:38,花1元购买1瓶并喝掉
余钱:37,花1元购买1瓶并喝掉
余钱:36,花1元购买1瓶并喝掉
余钱:35,花1元购买1瓶并喝掉
余钱:34,花1元购买1瓶并喝掉
余钱:33,花1元购买1瓶并喝掉
余钱:32,花1元购买1瓶并喝掉
余钱:31,花1元购买1瓶并喝掉
余钱:30,花1元购买1瓶并喝掉
余钱:29,花1元购买1瓶并喝掉
余钱:28,花1元购买1瓶并喝掉
余钱:27,花1元购买1瓶并喝掉
余钱:26,花1元购买1瓶并喝掉
余钱:25,花1元购买1瓶并喝掉
余钱:24,花1元购买1瓶并喝掉
余钱:23,花1元购买1瓶并喝掉
余钱:22,花1元购买1瓶并喝掉
余钱:21,花1元购买1瓶并喝掉
余钱:20,花1元购买1瓶并喝掉
余钱:19,花1元购买1瓶并喝掉
余钱:18,花1元购买1瓶并喝掉
余钱:17,花1元购买1瓶并喝掉
余钱:16,花1元购买1瓶并喝掉
余钱:15,花1元购买1瓶并喝掉
余钱:14,花1元购买1瓶并喝掉
余钱:13,花1元购买1瓶并喝掉
余钱:12,花1元购买1瓶并喝掉
余钱:11,花1元购买1瓶并喝掉
余钱:10,花1元购买1瓶并喝掉
余钱:9,花1元购买1瓶并喝掉
余钱:8,花1元购买1瓶并喝掉
余钱:7,花1元购买1瓶并喝掉
余钱:6,花1元购买1瓶并喝掉
余钱:5,花1元购买1瓶并喝掉
余钱:4,花1元购买1瓶并喝掉
余钱:3,花1元购买1瓶并喝掉
余钱:2,花1元购买1瓶并喝掉
余钱:1,花1元购买1瓶并喝掉
空瓶数:50,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:49,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:48,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:47,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:46,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:45,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:44,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:43,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:42,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:41,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:40,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:39,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:38,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:37,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:36,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:35,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:34,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:33,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:32,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:31,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:30,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:29,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:28,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:27,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:26,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:25,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:24,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:23,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:22,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:21,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:20,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:19,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:18,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:17,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:16,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:15,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:14,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:13,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:12,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:11,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:10,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:9,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:8,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:7,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:6,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:5,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:4,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:3,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
空瓶数:2,兑换2个空瓶为1元钱
余钱:1,花1元购买1瓶并喝掉
总喝掉瓶数:99

根据输出信息,符合我们的预期,确实是只要有钱就购买。如果换一种策略,只要有2个空瓶了就兑换先,那么可以将规则1和规则2的salience属性值对调,这样规则2就会优先执行。

可见输出信息不一样了,也非常符合我们的预期。由此可见,不同的规则分析可以导致不同的执行路径,但最终效果都一样,很好的推理出了我们想要的结果。通过Drools规则推理引擎还可以解决很多类似的问题。

【java规则引擎】一个基于drools规则引擎实现的数学计算例子的更多相关文章

  1. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  2. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

  3. 【java规则引擎】之Drools之Rete算法

    一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...

  4. Drools规则引擎入门指南(一)

    最近项目需要增加风控系统,在经过一番调研以后决定使用Drools规则引擎.因为项目是基于SpringCloud的架构,所以此次学习使用了SpringBoot2.0版本结合Drools7.14.0.Fi ...

  5. drools规则引擎初探

    https://www.cnblogs.com/yuebintse/p/5767996.html 1.drools是什么 Drools是为Java量身定制的基于Charles  Forgy的RETE算 ...

  6. Drools规则引擎环境搭建

    Drools 是一款基于Java 的开源规则引擎,所以在使用Drools 之前需要在开发机器上安装好JDK 环境,Drools5 要求的JDK 版本要在1.5 或以上. Drools5 提供了一个基于 ...

  7. Spring Boot+Drools规则引擎整合

    目的 官方的Drools范例大都是基于纯Java项目或Maven项目,而基于Spring Boot项目的很少. 本文介绍如何在Spring Boot项目上加上Drools规则引擎. POM依赖 POM ...

  8. Drools规则引擎-memberOf操作

    场景 规则引擎技术讨论2群(715840230)有同学提出疑问,memberOf的使用过程中如果,memberOf之后的参数不是集合也不是数组,而是格式如"1,2,3,4"的字符串 ...

  9. SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

    本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...

随机推荐

  1. Python面试题之Python和Java中Super方法的区别

    python 的 super 是一个函数,需要两个参数,第一个参数是类,第二个参数是实例,返回值是一个类对象. 其意义是:站在参数2这个实例的角度看去, 参数1这个类的‘父亲’是谁,把‘父亲’返回. ...

  2. 介绍Web项目中用到的几款表单验证插件

    第一个插件 jqueryvalidation 官网地址:http://jqueryvalidation.org/ 第二个插件 nice Validator 官网地址: http://niceue.co ...

  3. 20162305 实验二 Java面向对象程序设计 实验报告

    20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...

  4. jz2440存储管理实验【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 简介:先来简单的说明一下这次的实验,看看下图,我们的程序通过烧录器下载到nandflash当中去,之后在启动的时 ...

  5. JAVA基础补漏--static

    静态方法不能访问非静态变量的原因 静态的方法和变量在内存中先产生,非静态的后产生,在静态调用时非静态可能还未创建,所以会发生错误,故不能访问. static的内存图 静态代码块 static { Sy ...

  6. NSwag在asp.net web api中的使用,基于Global.asax

    https://github.com/NSwag/NSwag/wiki/OwinGlobalAsax This page explains how to use the NSwag OWIN midd ...

  7. spark学习11(Wordcount程序-本地测试)

    wordcount程序 文件wordcount.txt hello wujiadong hello spark hello hadoop hello python 程序示例 package wujia ...

  8. Activity启动的四种方式

    Activity启动方式有四种,分别是: standardsingleTopsingleTasksingleInstance 可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大 ...

  9. MYSQL 多实例运行

    1.创建数据文件 mkdir /var/lib/mysql_3307 mysql_install_db --datadir=/var/lib/mysql_3307 --user=mysql 2.给数据 ...

  10. JAVA中的枚举使用总结

    概念 在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类; 理解 类里面定义了固定数量的实例,类名如同命令空间 代码 pac ...