因为在项目要用到Drools,所以下面写了一个简单的例子学习入门。

一、Drools简介:

JBoss Rules 的前身是Codehaus的一个开源项目叫 Drools。最近被纳入JBoss门下,更名为JBoss Rules,成为了JBoss应用服务器的规则引擎。

Drools 是为 Java 量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。

Drools 的用 XML 的<Conditons>、<Consequence> 节点表达If–Then句式,而里面可以嵌入上述语言的代码作为判断语句和执行语句。

其中 Java 代码会使用Antlr进行解释,而 Groovy 和 Python 本身就是脚本语言,可以直接调用。

Drools 的聪明之处在于,用 XML 节点来规范 If–Then 句式和事实的定义,使引擎干起活来很舒服。

而使用 Java,Groovy等原生语言来做判断和执行语句,让程序员很容易过渡、移植,学习曲线很低。

二、几个重要概念

  • 事实(Fact):对象之间及对象属性之间的关系
  • 规则(rule):是由条件和结论构成的推理语句,一般表示为if...Then。一个规则的if部分称为LHS,then部分称为RHS。
  • 模式(module):就是指IF语句的条件。这里IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。

三、.drl 文件内容

package com.rulesimport com.drools.model.Person
import com.drools.model.Goodsrule "test-drools-older than 60"whenno-loop truelock-on-active truesalience 1$Goods : Goods(person.age > 60)
then$Goods.setDiscount(80);System.out.println("test-drools-older than 60 " + $Goods.getPerson().getAge());
end
  • package 与Java语言类似,drl的头部需要有package和import的声明,package不必和物理路径一致。
  • import 导出java Bean的完整路径,也可以将Java静态方法导入调用。
  • rule 规则名称,需要保持唯一 件,可以无限次执行。
  • no-loop 定义当前的规则是否不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行。
  • lock-on-active 将lock-on-active属性的值设置为true,可避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行。
  • salience 用来设置规则执行的优先级,salience 属性的值是一个数字,数字越大执行优先级越高, 同时它的值可以是一个负数。默认情况下,规则的 salience 默认值为 0。如果不设置规则的 salience 属性,那么执行顺序是随机的。
  • when 条件语句,就是当到达什么条件的时候
  • then 根据条件的结果,来执行什么动作
  • end 规则结束

这个规则文件就是描述了,当符合什么条件的时候,应该去做什么事情,每当规则有变动的时候,我们只需要修改规则文件,然后重新加载即可生效。

四、kmodule.xml

kmodule.xml的作用就是告诉代码规则文件drl在哪里,在drools中这个文件就是kmodule.xml,放置到resources/META-INF目录下。kmodule.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="rules"><ksession name="all-rules"/></kbase>
</kmodule>

以下对配置说明进行简单说明:

  • Kmodule 中可以包含一个到多个 kbase,分别对应 drl 的规则文件。
  • Kbase 需要一个唯一的 name,可以取任意字符串。
  • packages 为drl文件所在resource目录下的路径。注意区分drl文件中的package与此处的package不一定相同。多个包用逗号分隔。默认情况下会扫描 resources目录下所有(包含子目录)规则文件。
  • kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称
    就可以查找到该 KieBase,但每个 module 最多只能有一个默认 KieBase。
  • kbase 下面可以有一个或多个 ksession,ksession 的 name 属性必须设置,且必须唯一。

五、下面是一个简单的入门例子

1、首先项目的结构如下

2、引入drools的依赖

    <dependencies><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.7.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.7.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>7.7.0.Final</version></dependency></dependencies>

3、创建一个xml,注意一定要放在META-INF文件夹下,drools会自动解析它

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="rules"><ksession name="all-rules"/></kbase>
</kmodule>

4、创建实体Goods和Person

5、创建规则droolsRules.drl

package com.rulesimport com.drools.model.Person
import com.drools.model.Goodsrule "test-drools-older than 60"when$Goods : Goods(person.age > 60)
then$Goods.setDiscount(80);System.out.println("test-drools-older than 60 " + $Goods.getPerson().getAge());endrule "test-drools-other"when$Goods : Goods(person.age <= 60)then$Goods.setDiscount(70);System.out.println("test-drools-other " + $Goods.getPerson().getAge());end

6、测试类

public class DroolsTest {public static void main(String[] args) {//获取一个实例KieServices kieServices = KieServices.Factory.get();//默认去读取配置文件KieContainer kieContainer = kieServices.getKieClasspathContainer();//根据这个名词去获取kieSessionKieSession kieSession = kieContainer.newKieSession("all-rules");Person p1 = new Person();p1.setAge(30);p1.setName("Tom");Goods g1 = new Goods();g1.setPerson(p1);Person p2 = new Person();p2.setAge(70);p2.setName("Joy");Goods g2 = new Goods();g2.setPerson(p2);//将person实例放入session中kieSession.insert(g1);kieSession.insert(g2);//开始执行规则,并获取执行了多少条规则int count = kieSession.fireAllRules();//关闭sessionkieSession.dispose();System.out.println("Fire " + count + " rule(s)!");System.out.println("The discount of g1 is " + g1.getDiscount() + "%");System.out.println("The discount of g2 is " + g2.getDiscount() + "%");}
}

7、运行结果

test-drools-older than 60 70
test-drools-other 30
Fire 2 rule(s)!
The discount of g1 is 70%
The discount of g2 is 80%

参考:Drools 规则文件语法概述

Drools简单入门相关推荐

  1. drools的简单入门案例

    文章目录 一.背景 二.为什么要学习drools 三.实现上方这个简单的打折案例 1.引入jar包 2.编写kmodule.xml配置文件 3.编写规则文件 1.规则文件的语法 2.编写规则文件 3. ...

  2. BizTalk 2006 简单入门示例程序(附源项目文件下载)

    BizTalk 2006 简单入门示例程序(附源项目文件下载) 为初学BizTalk Server 2006的开发人员,提供一个简单入门的示例程序,包括一个Receive Port.Send Port ...

  3. python如何读取mat文件可视化_python Matplotlib数据可视化(1):简单入门

    1 matplot入门指南 matplotlib是Python科学计算中使用最多的一个可视化库,功能丰富,提供了非常多的可视化方案,基本能够满足各种场景下的数据可视化需求.但功能丰富从另一方面来说也意 ...

  4. ARM NEON 编程简单入门1

    原文:http://blog.csdn.net/silentob/article/details/72954618  ARM NEON 编程简单入门1 NEON简介 NEON是适用于ARM Corte ...

  5. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  6. EChart.js 简单入门

    EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Visual Studio里的自带控件,使用比 ...

  7. 【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试

    [我的区块链之路]- Hyperledger fabric的简单入门(四)链码的编写及调试       之前的文章中我们有讲过了fabric的一些核心的配置文件的选项说明,讲过fabric 的网络启动 ...

  8. 基于vue-cli、elementUI的Vue超简单入门小例子

    基于vue-cli.elementUI的Vue超简单入门小例子 这个例子还是比较简单的,独立完成后,能大概知道vue是干嘛的,可以写个todoList的小例子. 开始写例子之前,先对环境的部署做点简单 ...

  9. 【java开发系列】—— spring简单入门示例

    回顾 1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控 ...

最新文章

  1. WebDriver 识别反爬虫的原理和破解方法~
  2. 赢在中国 - 史玉柱经典语录
  3. 华中科技大学 教学大纲 计算机,教学大纲-华中科技大学计算机学院
  4. JS操作Excel读取和写入(模板操作)
  5. 面试算法工程师时,我居然被化学专业转行的老哥血虐了
  6. eclipse java maven_java – 非常轻量级的Eclipse-Maven集成 – 仅...
  7. u2020 华为_华为MateBook X Pro 2020款评测:全面屏商务旗舰再升级
  8. linux 安装python3.8的几种方法
  9. python自定义配置文件读取_python读取和自定义配置文件的方法
  10. 动态列之函数实现动态列
  11. rman备份mysql_rman备份与还原
  12. 宝马android系统升级,宝马史上最大规模软件升级,换新OS7系统和安卓Auto,您的换了吗...
  13. ElementUI插件引用
  14. c语言空格eof什么意思,eof在c语言中表示什么?
  15. IOS调用微信扫一扫scanQRCode报错the permission value is offline verifying
  16. 罗格斯大学计算机科学属哪个学院,罗格斯大学工程学院信息介绍以及申请条件详细解读...
  17. quartus 复制IP核
  18. macbook air未能与服务器,少量2018款Macbook Air存在问题:苹果已通知维修但并未告知详细情况...
  19. IOS实现3DTouch功能
  20. 开源了自己开发的后台管理系统

热门文章

  1. android 4.5屏幕,屏幕大也不怕 4.5吋起大屏续航手机推荐
  2. node.js的下载安装详细步骤(还有安装配套的express、淘宝镜像、webpack、Vue)
  3. JAVA、IDEA超级实用快捷键(公司开发项目中常用快捷键)
  4. zipfile的压缩和解压缩
  5. 银河麒麟服务器操作系统V10SP2搭建时间服务器
  6. 银河麒麟V10 SP2 server 搭建 ntp服务端
  7. class function
  8. 移动硬盘误删分区,数据完美找回
  9. Linux系统下,下载谷歌浏览器
  10. H3C服务器查看raid