原文地址:http://blog.xiongzhijun.com/?p=582
参考tag:training_1
我们来先看一下一个标准的规则文件定义文件是怎么样的:
package os.nut.drools
import os.nut.drools.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
Java程序员可以很清楚看出来,这个规则文件跟一个Java文件非常类似,里面包含了很多Java语句,不用怀疑,这些就是Java代码,而不是类Java语法的代码。
上面这个规则文件里面包含4个部分:package、import和两个rule:
- package:package语句的定义跟Java里面的package语句类似,唯一不同的就是在DRL文件中package后面跟的包名是不需要跟文件目录有对应关系的,上例就可以看出来这个不同:package定义是os.nut.drools,而所在的目录是rules。
- import:import语句的含义跟java中是一样的,就是如果在本文件中需要使用某些类的话,需要通过import语句引入进来,如果需要的类在package定义的包中就不需要再引入了,这个跟Java的概念是一致的。在上例中的import语句其实是没有必要的。
- rule:上例定义了两个rule,也就是定义了两个规则。一个规则以rule关键字开始,以end关键字结束。
- 上面一个rule包含了三个部分,分别是name、when、then。
- name紧跟在rule关键字之后,可以是一个以引号(双引号、单引号均可)包含的字符串,可以包含空格等字符,如果字符串只包含字母、数字、下划线(也就是Java变量命名规则)的话,也可以不用引号,但是推荐使用引号。
- when语句的意思就是执行下面then语句的条件,也就是说当when条件满足的情况下,才会执行then,类似于Java里面的if语句,为什么用when而不用if呢,这是因为when代表的意思是当什么“事件”发生时,当什么“事实”存在时,然后执行then。
- then语句就是执行的动作,就是当什么事件发生,或者什么事实存在时,执行的动作序列。then后面的语句也就是Action。
- 事件和事实是什么东西呢?在Drools里面这两个分别称之为“Event”和“Fact”,“事件”其实也是“事实”,只不过是一种特殊的事实而已。
- 事实是什么东西呢?一个事实其实就是一个POJO,只不过这个Java对象是存放在一个特殊的空间里面,这个空间就是“Working Memory”,所有存放在Working Memory里面的对象都是事实(Fact)。when语句就是检查在Working Memory里面是不是存在满足条件的事实。
- 事件呢?怎么个特殊法?这个我们可以暂时不用管它,到后面学习CEP的时候自然就会理解了。CEP是什么?现在不用管它!
when语句解读:
1
|
m : Message( status == Message.HELLO, myMessage : message )
|
上面是rule “Hello World”的when语句。这个语句是什么意思呢?它的意思就是:
当存在一个Message对象,并且这个Message的status字段值为Message.HELLO的时候,就可以执行下面的then语句了。用自然语言描述就是:当存在一个状态为HELLO的消息的事实时,就执行下面的动作,否则就不做。
其中Message()就是执行类型匹配,意思就是要求Working Memory中存在类型为Message的对象(事实),然后status==Message.HELLO语句呢,就是约束条件,表示该Message对象的status字段为HELLO才符合条件。
另外的m和myMessage分别表示什么呢?m加冒号的意思是将这个Message对象赋值给m,而myMessage加冒号表示将这个Message对象的message字段的值赋值给myMessage变量。然后在下面的then语句中使用这些定义的变量了。
then语句解读System.out.println( myMessage );
m.setMessage( "Goodbye cruel world" );
m.setStatus( Message.GOODBYE );
update( m );
这个例子里面前三句都是普通的Java语句,唯一不同的就是下面这个update语句,这个语句的意思就是通知规则引擎m对象发生变化了,m是什么?m就是一个存放在Working Memory里面的一个Message事实,这句话就是说m这个事实发生了变化,那么规则引擎就需要重新进行规则运算,在本例中就是会在执行了update之后执行下面的“GoodBye”规则。
为什么执行“GoodBye”规则?GoodBye规则需要匹配的是status为GOODBYE的Message事实,但是一开始并没有这样的事实存在,只有当“Hello World”规则执行到了update语句的时候,更新了Message事实,这个时候规则引擎重新运算规则,WorkingMemory中就存在status为GOODBYE的Message事实了,“GoodBye”规则就会运行了,这个从控制台输出中就可以看出来了。