规则引擎
包定义,规则文件的第一行
1package aaa
引入资源,和javaimport
一样
1import java.util.List
定义规则全局变量
1global java.util.List myGlobalList;
2
3rule "Using a global"
4when
5 eval( true )
6then
7 myGlobalList.add( "Hello World" );
8end
在过程中添加全局变量
1List list = new ArrayList();
2KieSession kieSession = kiebase.newKieSession();
3kieSession.setGlobal( "myGlobalList", list );
定义规则文件中的方法
1function String hello(String name) {
2 return "Hello "+name+"!";
3}
4import function my.package.Foo.hello
5rule "using a static function"
6when
7 eval( true )
8then
9 System.out.println( hello( "Bob" ) );
10end
搜索工作内存中与指定条件匹配的事实的简单方法
1对所有30岁以上的人的简单查询
2query "people over the age of 30"
3 person : Person( age > 30 )
4end
5
6查询超过x岁的人,以及居住在y的人
7query "people over the age of x" (int x, String y)
8 person : Person( age > x, location == y )
9end
10
11QueryResults results = ksession.getQueryResults( "people over the age of 30" );
12System.out.println( "we have " + results.size() + " people over the age of 30" );
13
14System.out.println( "These people are are over 30:" );
15
16for ( QueryResultsRow row : results ) {
17 Person person = ( Person ) row.get( "person" );
18 System.out.println( person.getName() + "\n" );
19}
定义规则,一个规则包含三个部分:属性部分,条件部分(LHS),结果部分(RHS)
1rule "ruleName"
Ruleflow
是一个Drools功能,可让您控制规则的触发.由相同的规则流组标识汇编的规则仅在其组处于活动状态时触发.将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group
属性的值,从而使用对应的规则.org.drools.runtime.rule.AgendaFilter
的accept
方法控制规则是否执行java
和MVEL
.虽然方言可以在包级别指定,但此属性允许为规则覆盖包定义dd-MMM-yyyy
(25-Sep-2009)dd-MMM-yyyy
(25-Sep-2009)enabled
属性,并且设置为false
,该规则将不会执行定义当前规则的条件,如when Message()
; 判断当前workingMemory中是否存在Message对象.
Left Hand Side
(LHS
)是规则的条件部分的公共名称.它由零个或多个条件元素组成.
如果LHS为空,它将被认为是一个条件元素,它总是为真,并且当创建一个新的WorkingMemory会话时,它将被激活一次.
1 Conditions / LHS —匹配模式(Patterns)
2
3 没有字段约束的Pattern
4 Person()
5
6 有文本字段约束的Pattern
7 Person( name == “bob” )
8
9 字段绑定的Pattern
10 Person( $name : name == “bob” )
11 变量名称可以是任何合法的java变量,$是可选的,可由于区分字段和变量
12
13 Fact绑定的Pattern
14 $bob : Person( name == “bob” )字段绑定的Pattern
15
16 变量约束的Pattern
17 Person( name == $name )
Drools提供了十二种类型比较操作符:
>
>=
<
<=
==
!=
contains
not contains
memberOf
not memberOf
matches
not matches
1Cheese( name contains "tilto" )
2Person( fullName contains "Jr" )
3String( this contains "foo" )
contains
相反1CheeseCounter( cheese memberOf $matureCheeses )
memberOf
相反1Cheese( type matches "(Buffalo)?\\S*Mozarella" )
matches
相反exists
,则规则将只激活最多一次,而不管在工作存储器中存在与存在模式中的条件匹配的数据量这里可以写普通java代码,即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用.
Right Hand Side
(RHS
)是规则的结果或动作部分的通用名称;此部分应包含要执行的操作的列表.在规则的RHS中使用命令式或条件式代码是不好的做法;作为一个规则应该是原子
的性质 - “when this, then do this
”,而不是“when this, maybe do this
”.规则的RHS部分也应该保持较小,从而保持声明性和可读性.如果你发现你需要在RHS中的命令式和/或条件代码,那么也许你应该把这个规则分成多个规则. RHS
的主要目的是插入,删除或修改工作存储器数据.为了协助,有一些方便的方法可以用来修改工作记忆;而不必首先引用工作内存实例.
workingMemory
中插入一个新的Fact对象,会触发规则的再次执行,除非使用no-loop
限定.insert
,但是当没有更多的facts支持当前触发规则的真实性时,对象将被自动删除.update
语法不同,结果都是更新操作.该语言扩展提供了一种结构化的方法来更新事实.它将更新操作与一些setter调用相结合来更改对象的字段.drools.halt()
立即终止规则执行.这是需要将控制权返回到当前会话使用fireUntilHalt()
的点.agenda group
.Tuple
,而drools.getActivation()传递相应的激活.