Drools规则文件结构说明
Facts(即普通的POJO)
指普通业务对象插入到Workingmemory后的对象
规则可以对fact对象进行任意的对象操作
是规则与应用系统交换的桥梁
返回FactHandler对象,是插入到Workingmemory后的句柄。
facts例子:
public class Customer { private long customerId; private String customerName; private String state; //省略getter/setter方法 }
一、规则文件构成
package(规则文件所在包)
import(导入java包)
global(规则文件中的”全局变量”)
function(函数)
query(查找)
rule(规则)
对应示例:
package com.sample import com.sample.DroolsTest.Message; rule "Hello World" when m : Message( status == Message.HELLO, myMessage : message ) then System.out.println( myMessage ); m.setMessage( "Goodbye cruel world" ); m.setStatus( Message.GOODBYE ); update( m ); end rule "GoodBye" when Message( status == Message.GOODBYE, myMessage : message ) then System.out.println( myMessage ); end
二、规则体部分
1、rule规则体
rule "Rule Name" 属性名称 属性值 when 条件 then 行为 end
以下为在规则中使用的常用属性及其描述:
1)agenda-group:为规则设定所属的规则组,当规则组获得焦点时,会匹配组内的规则,如果规则组没有获得焦点,那么组内的规则将不会被触发。该属性默认为MAIN。
2)salience:优先级,数值越大越先执行,这个可以控制规则的执行顺序。从0开始,即0优先级最小。
2、import
导入规则文件需要使用到的外部变量,不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。
1)导入类
2)导入Java类的静态方法
import function 类名.静态方法名
当调用该静态方法时,使用eval()。括号内写”方法名(参数)”。eval(true)参数为布尔值。类似于 while(true)。
三、十二种类型比较操作符
> >= < <= == != contains / not contains / memberOf / not memberOf /matches/ not matches
四、规则的条件部分LHS(Left Hand Side)
1、when:规则条件开始。条件可以单个,也可以多个,多个条件一次排列,比如wheneval(true)$customer:Customer()$message:Message(status==0)上述罗列了三个条件,当前规则只有在这三个条件都匹配的时候才会执行RHS部分,三个条件中第一个eval(true):是一个默认的api,true 无条件执行,类似于 while(true)$message:Message(status==0) 这句话标示的:当前的workingMemory存在Message类型并且status属性的值为0的Fact对象,这个对象通常是通过外部java代码插入或者自己在前面已经执行的规则的RHS部分中insert进去的。前面的$message代表着当前条件的引用变量,在后续的条件部分和RHS部分中,可以使用当前的变量去引用符合条件的FACT对象,修改属性或者调用方法等。可选,如果不需要使用,则可以不写。
2、对Fact对象private属性的操作可以使用getter和setter方法或.+属性名。
3、如果条件全部是 &&关系,可以使用“,”来替代,但是两者不能混用。
如:$customer :Customer(name == “john”, age > 20)
五、规则的结果部分RHS(Right Hand Side)
1、当规则条件满足,则进入规则结果部分执行,结果部分可以是纯java代码。
六、函数Functions
function可以在规则文件中定义,但更多的是使用外部类中定义的static方法,这样只要Java中可以实现的逻辑,在规则中都可以做为function调用。
七、方言dialect
在规则表达式中可以使用方言来简化表达式,使之更加具有可读性。Drools方言默认的是Java,Drools也支持mvel。mvel是一种基于Java应用程序的表达式语言,它支持属性和方法的直接访问。
八、规则的条件部分
目前本人正在使用的两个表达式是eval表达式和内置eval表达式。
eval表达式:
$account : Account() eval(accountService.isUniqueAccountNumber($account))
内置eval表达式:
$customer1 : Customer() Customer(eval(age == $customer1.getAge() + 10))
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接