Drools简单入门
因为在项目要用到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简单入门相关推荐
- drools的简单入门案例
文章目录 一.背景 二.为什么要学习drools 三.实现上方这个简单的打折案例 1.引入jar包 2.编写kmodule.xml配置文件 3.编写规则文件 1.规则文件的语法 2.编写规则文件 3. ...
- BizTalk 2006 简单入门示例程序(附源项目文件下载)
BizTalk 2006 简单入门示例程序(附源项目文件下载) 为初学BizTalk Server 2006的开发人员,提供一个简单入门的示例程序,包括一个Receive Port.Send Port ...
- python如何读取mat文件可视化_python Matplotlib数据可视化(1):简单入门
1 matplot入门指南 matplotlib是Python科学计算中使用最多的一个可视化库,功能丰富,提供了非常多的可视化方案,基本能够满足各种场景下的数据可视化需求.但功能丰富从另一方面来说也意 ...
- ARM NEON 编程简单入门1
原文:http://blog.csdn.net/silentob/article/details/72954618 ARM NEON 编程简单入门1 NEON简介 NEON是适用于ARM Corte ...
- Python 简单入门指北(二)
Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...
- EChart.js 简单入门
EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart 这个是Visual Studio里的自带控件,使用比 ...
- 【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试
[我的区块链之路]- Hyperledger fabric的简单入门(四)链码的编写及调试 之前的文章中我们有讲过了fabric的一些核心的配置文件的选项说明,讲过fabric 的网络启动 ...
- 基于vue-cli、elementUI的Vue超简单入门小例子
基于vue-cli.elementUI的Vue超简单入门小例子 这个例子还是比较简单的,独立完成后,能大概知道vue是干嘛的,可以写个todoList的小例子. 开始写例子之前,先对环境的部署做点简单 ...
- 【java开发系列】—— spring简单入门示例
回顾 1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控 ...
最新文章
- WebDriver 识别反爬虫的原理和破解方法~
- 赢在中国 - 史玉柱经典语录
- 华中科技大学 教学大纲 计算机,教学大纲-华中科技大学计算机学院
- JS操作Excel读取和写入(模板操作)
- 面试算法工程师时,我居然被化学专业转行的老哥血虐了
- eclipse java maven_java – 非常轻量级的Eclipse-Maven集成 – 仅...
- u2020 华为_华为MateBook X Pro 2020款评测:全面屏商务旗舰再升级
- linux 安装python3.8的几种方法
- python自定义配置文件读取_python读取和自定义配置文件的方法
- 动态列之函数实现动态列
- rman备份mysql_rman备份与还原
- 宝马android系统升级,宝马史上最大规模软件升级,换新OS7系统和安卓Auto,您的换了吗...
- ElementUI插件引用
- c语言空格eof什么意思,eof在c语言中表示什么?
- IOS调用微信扫一扫scanQRCode报错the permission value is offline verifying
- 罗格斯大学计算机科学属哪个学院,罗格斯大学工程学院信息介绍以及申请条件详细解读...
- quartus 复制IP核
- macbook air未能与服务器,少量2018款Macbook Air存在问题:苹果已通知维修但并未告知详细情况...
- IOS实现3DTouch功能
- 开源了自己开发的后台管理系统