Drools高级语法

Drools关键字

关键字 描述
package 包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用
import 用于导入类或静态方法
global 全局变量
function 自定义函数
query 查询
rule end 规则体

global全局变量

全局变量,一般用作执行规则后的结果数据返回或对具体某个服务调用等,例如:一个电子邮件服务的实例,在调用规则引擎的集成代码中,获取emailService对象,然后将其设置在工作内存中。

1
语法结构为:global 对象类型 对象名称

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
global java.util.List myGlobalList;//如果在规则文件中使用了全局变量,那么必须在规则引擎中设置全局变量值

rule "global_rule1"
when
eval( true )
then
myGlobalList.add( "Hello World" );//
System.out.println("global_rule1 is execution...");
end

rule "global_rule2"
when
eval( true )
then
System.out.println("myGlobalList集合的元素个数:"+myGlobalList.size());
System.out.println("global_rule2 is execution...");
end

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//测试高级语法
@Test
public void test6() throws InterruptedException {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
List list = new ArrayList();
////设置全局变量,名称和类型必须和规则文件中定义的全局变量名称对应
kieSession.setGlobal( "myGlobalList", list );
//激活规则引擎,如果匹配成功则执行规则
kieSession.fireAllRules();

//通过规则过滤器实现只执行指定规则
//kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule5"));
kieSession.dispose();

System.out.println("list.size():"+list.size());
}

query查询

query语法提供了一种查询working memory中符合约束条件的Fact对象的简单方法。它仅包含规则文件中的LHS部分,不用指定”when”和”then”部分。query有一个可选参数集合,每一个参数都有可选的类型。如果没有指定类型,则默认为Object类型。引擎会尝试强转为需要的类型。对于KieBase来说,query的名字是全局性的,因此不要向同一RuleBase的不同包添加相同名称的query。

使用ksession.getQueryResults("name") 方法可以获得查询得结果,其中name为query的名称,方法的返回结果是一个列表,从中可以获取匹配查询到的对象。

示例:

1
2
3
4
5
6
7
8
9
10
11
//不带参数的查询
//当前query用于查询Working Memory中age>30的Person对象
query "query-1"
$person : Person(age > 30)
end

//带有参数的查询
////当前query用于查询Working Memory中age>30同时name需要和传递的参数name相同的Person对象
query "query-2"(String nameParam)
$person : Person(age > 30,name == nameParam)
end

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//测试高级语法
@Test
public void test7() throws InterruptedException {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();

Person p1 = new Person();
p1.setName("JACK1");
p1.setAge(29);
Person p2 = new Person();
p2.setAge(40);
p2.setName("JACK2");

kieSession.insert(p1);
kieSession.insert(p2);


//激活规则引擎,如果匹配成功则执行规则
kieSession.fireAllRules();

//通过规则过滤器实现只执行指定规则
//kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule5"));


QueryResults results = kieSession.getQueryResults("query-1");
System.out.println("results size is " + results.size());
for(QueryResultsRow row : results){
Person person = (Person) row.get("$person");
System.out.println("Person from WM, age : " + person.getAge());
}

System.out.println("-----------------------");
QueryResults results2 = kieSession.getQueryResults("query-2", "JACK1");

for(QueryResultsRow row : results){
Person person = (Person) row.get("$person");
System.out.println(person);
}
kieSession.dispose();

}

function函数

在规则中可以通过函数来做一些通用的逻辑,就相当于Java类中的方法一样

1
2
3
function String format(String name) {
return "hello " + name;
}

函数的返回类型和参数类型于Java的规则一样

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
function String format(String name) {
return "hello " + name;
}

//测试函数
rule "function_rule"
when
$person:Person(name!=null&&age>30)
then
//调用上面定义的函数
String ret = format($person.getName());
System.out.println(ret);
end

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//测试高级语法
@Test
public void test7() throws InterruptedException {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();

Person p1 = new Person();
p1.setName("JACK1");
p1.setAge(29);
Person p2 = new Person();
p2.setAge(40);
p2.setName("JACK2");

kieSession.insert(p1);
kieSession.insert(p2);
//激活规则引擎,如果匹配成功则执行规则
kieSession.fireAllRules();
kieSession.dispose();

}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信