Drools是一个基于java的开源规则引擎,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重新部署服务器就可以立即在线上环境生效,在实际生产环境中方便自行改变某些参数而不需要修改源代码。
1、Drools语法
开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要传进去参数,其次要获取到接口的实现执行完毕后的结果。而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。
在drools中,这个传递数据进去的对象,术语叫 Fact对象。Fact对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,规则通过对Fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前 workingMemory中插入删除新的fact对象。
规则文件可以使用 .drl文件,也可以是.xml文件,这里我们使用drl文件。在drl文件中,主要由这几部分组成,即package、import、属性以及rule。规则语法:
package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行,类似于java当中的package,表示一个路径。特别的是,package的名字是随意的,不必对应物理路径,这里只是逻辑上的一种区分。
比如:package com.drools.demo.point
import:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。
比如:import com.drools.demo.point.PointDomain;
import com.drools.demo.point.PointDomain.getById;
import java.math.BigDecimal;
rule:定义一个规则。rule "ruleName",这是规则名,我的理解是更像java中的方法名。一个规则可以包含三个部分:
属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。
条件部分,即LHS,定义执行当前规则的判断条件,条件符合的话执行then部分。
结果部分,即RHS,这里可以写普通java代码,即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用。
简单的规则例子: