Drools 再学习

左手定则详解

1
2
3
4
5
6
7
@Data
public class UserInfo {
private String name;
private Integer age;
private List<String> interests;
private Map<String, String> tags;
}
1
2
3
public interface UserService {

}
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.kagura;


import com.drools.core.KieTemplate;
import com.kagura.entity.UserInfo;
import org.assertj.core.util.Lists;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.Map;

public class Second extends Base{

@Autowired
private KieTemplate kieTemplate;

private KieSession kieSession;

private Object object;

// @Before => @Test => @After
@Before
public void before() throws InterruptedException {
Thread.sleep(1000);
this.kieSession = kieTemplate.getKieSession("rule.drl");
}

@Test
public void test01() {
object = 1d;
}

@After
public void after() {
kieSession.insert(object);
kieSession.fireAllRules();
}





@Test
public void test02() {
UserInfo userInfo = new UserInfo();
userInfo.setName("张");
//userInfo.setAge(20);
object = userInfo;
}


@Test
public void test03() {
UserInfo info = new UserInfo();
info.setInterests(Lists.newArrayList("tea", "coffee"));
//info.setInterests(Lists.newArrayList("coffee", "tea"));
object = info;
}

@Test
public void test04() {
UserInfo info = new UserInfo();
Map<String, String> map = new HashMap<>();
map.put("job", "se");
info.setTags(map);
object = info;
}

@Test
public void test05() {
UserInfo info = new UserInfo();
info.setInterests(Lists.newArrayList("tea1", "coffee"));
//info.setInterests(Lists.newArrayList("coffee", "tea"));
object = info;
}

@Test
public void test06() {
UserInfo info = new UserInfo();
info.setInterests(Lists.newArrayList("tea", "coffee"));
//info.setInterests(Lists.newArrayList("coffee", "tea"));
object = info;
}

@Test
public void test07() {
UserInfo info = new UserInfo();
info.setName("TonyKara");
object = info;
}

@Test
public void test08() {
UserInfo info = new UserInfo();
info.setInterests(Lists.newArrayList("tea1", "coffee"));
//info.setInterests(Lists.newArrayList("coffee", "tea"));
object = info;
}

}
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package rules;
dialect "java"

import java.util.*;
import com.kagura.service.*;
import com.kagura.entity.*;

global UserService userService;




//rule "评估double类型,且double为0d - test01"
//when
// $d : Double($d == 0)
//// $d : Double(this == 0)
//then
// System.err.println("test01 : " + $d);
//end

//
// 总结:
// 1. 接同类型对象
// 2. 满足括号中的规则
// 3. 多个规则需要根据配置同时满足

// or = ||
// , = and = &&
//rule "评估用户 - test02"
//when
// $u : UserInfo(name == "张" || name == "李");
//// $u : UserInfo(name == "张" || name == "李", age == 20)
//then
// System.err.println("test02 : " + $u);
//end
//

//rule "评估用户List - test03"
//when
// $u : UserInfo(interests.get(0) == "tea");
//// $u : UserInfo(interests[0] == "tea");
//then
// System.err.println("test03 : " + $u);
//end


//rule "评估用户Map - test04"
//when
// $u : UserInfo(tags.get("job") == "se");
//// $u : UserInfo(tags["job"] == "se");
//then
// System.err.println("test04 : " + $u);
//end

// 总结:
// List .get() List[]
// Map .get() Map[]


//rule "包含contains - test05"
//when
// $u : UserInfo(interests contains "tea");
//then
// System.err.println("test05 : " + $u);
//end
//
//rule "被包含memberOf - test06"
//when
// $u : UserInfo("tea" memberOf interests);
//then
// System.err.println("test06 : " + $u);
//end


//rule "正则memberOf - test07"
//when
// $u : UserInfo(name matches "Tony.*");
//then
// System.err.println("test07 : " + $u);
//end


rule "from memberOf - test08"
when
$u : UserInfo();
$s : String(this == "tea" || this == "coffee") from $u.interests;
then
System.err.println("test08 : " + $s);
end

规则属性

activation-group:同一个组,只会执行一个 rule。

salience 优先级。

agenda-group:议程组,同一个组,全部 rule 都会执行。

update:这里会一直打印 1,2 1,2 因为 update 会重新匹配,符合条件,继续重新执行。
在这里插入图片描述

no-loop true => 不进行重复执行
在这里插入图片描述

对于上面,no-loop true 还是重复打印了 1。
任何一个 rule 都执行一次,加上 lock-on-active true 可以解决。
在这里插入图片描述
加上 lock-on-active true的话,update 更新之后,也不会执行后续的 rule。
下面如果不加 “lock-on-active true” 属性,会执行两个 rule(从上到下)。加了之后,只会执行上面一个 rule。
在这里插入图片描述

insert,插入之后,会重新匹配所有的 rule。
上面一个 rule 加了“no-loop true”,所以只会执行一次输出“BBB”。下面则会匹配到,输出“CCC”。
在这里插入图片描述

retract 用完之后,把对象删除。
在这里插入图片描述

当前组中,激活其他组。
在这里插入图片描述

kieSession有状态,无状态

1
2
任何无状态的对象,都不需要手动去处理连接。
任何有状态的对象,都需要手动去关闭连接。

有状态:其实就是用完就关闭会话。
在这里插入图片描述

其实,无状态也是一个伪无状态。它也是需要释放的。只不过代码中帮我们做了。
在这里插入图片描述

决策表

好处:
1、更加清晰的实现逻辑代码
2、实现热部署
3、方便开发修改配置
4、为不懂开发的人员提供更新的条件

原理:使用 Excel 来配置规则,使用代码读取 Excel,把内容转换为 drl 格式,再读取内存来执行(Excel 可以给不懂开发的人员提供更新条件)。

在这里插入图片描述

定时

在这里插入图片描述

滑动窗口
在这里插入图片描述

热部署

1、每次都去重新读取 drl 文件,生成一个新的 KieSession(文件放到项目外)。
2、每次都去重新读取 Excel 文件,生成一个新的 KieSession(文件放到项目外)。