DroolsKIE

KIE 会话可以是无状态的,也可以是有状态的。在无状态 KIE 会话中,   来自 KIE 会话的先前调用(先前的会话状态)的数据在会话调用之间被丢弃。在有状态的 KIE 会话中,将保留该数据。您使用的 KIE 会话的类型取决于您的项目要求以及希望如何保留来自不同资产调用的数据。

运行环境

JDK 1.8

Drools 7.35.0.Final

Lombok

KIE 无状态会话

无状态 KIE 会话是不使用推断随时间对事实进行迭代更改的会话。在无状态的 KIE 会话中,来自 KIE 会话的先前调用(先前的会话状态)的数据在会话调用之间被丢弃,而在有状态的 KIE 会话中,该数据被保留。无状态 KIE 会话的行为类似于功能,因为它产生的结果由 KIE 基础的内容以及传递到 KIE 会话中以在特定时间点执行的数据确定。KIE 会话不存储先前传递到 KIE 会话中的任何数据。

无状态 KIE 会话通常用于以下用例:

  • 验证,例如验证某人有资格获得抵押贷款
  • 计算,例如计算抵押贷款溢价
  • 路由和过滤,例如将传入电子邮件分类到文件夹中或将传入电子邮件发送到目的地

例如,考虑以下驾驶执照数据模型和示例 DRL 规则:

驾驶执照申请的数据模型

1
2
3
4
5
6
7
8
@Data
@AllArgsConstructor
@NoArgsConstructor
class Applicant {
private String name;
private int age;
private boolean valid;
}

驾驶执照申请的示例 DRL 规则

1
2
3
4
5
6
7
8
9
10
package this.is.your.package

import this.is.your.Applicant

rule "Is of valid age"
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end

Is of valid age规则取消了任何未满 18 岁的申请人的资格。将Applicant对象插入 Drools 引擎后,Drools 引擎将评估每个规则的约束并搜索匹配项。"objectType"总是隐含该约束,然后评估任何数量的显式字段约束。该变量$a是在规则结果中引用匹配对象的绑定变量。

  • 美元符号($)是可选的,有助于区分变量名和字段名。

创建 KIE 容器

1
2
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();

此代码编译在类路径上找到的所有规则文件,并将此编译的结果(一个KieModule对象)添加到中KieContainer

最后,StatelessKieSession从实例化该对象,KieContainer并针对指定的数据执行该对象:

实例化无状态 KIE 会话并输入数据

1
2
3
4
5
6
StatelessKieSession kSession = kContainer.newStatelessKieSession();
Applicant applicant = new Applicant("Mr John Smith", 16, true);

assertTrue(applicant.isValid());
kSession.execute(applicant);
assertFalse(applicant.isValid());

在无状态 KIE 会话配置中,execute()调用用作实例化KieSession对象,添加所有用户数据并执行用户命令,调用fireAllRules()然后调用的组合方法dispose()。因此,对于无状态 KIE 会话,不需要像在有状态 KIE 会话中那样在会话调用后调用fireAllRules()或调用dispose()

在这种情况下,指定的申请人未满 18 岁,因此申请被拒绝。

有关更复杂的用例,请参见以下示例。本示例使用无状态 KIE 会话并针对可迭代对象列表(例如集合)执行规则。

用于驾驶执照申请的扩展数据模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Applicant {
private String name;
private int age;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Application {
private Date dateApplied;
private boolean valid;
}

扩大了驾驶执照申请的 DRL 规则集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package this.is.your.package

import this.is.your.Applicant
import this.is.your.Application

rule "Is of valid age"
when
Applicant(age < 18)
$a : Application()
then
$a.setValid(false);
end

rule "Application was made this year"
when
$a : Application(dateApplied > "01-jan-2009")
then
$a.setValid(false);
end

在无状态 KIE 会话中可迭代执行的扩展 Java 源代码

KIE 有状态会话


DroolsKIE
https://blog.josway.cc/2022/04/25/yuque/DroolsKIE/
作者
JOSWAY
发布于
2022年4月25日
许可协议