78.2. 有状态 KIE 会话
有状态 KIE 会话是一个会话,用于随着时间的推移对事实进行迭代更改。在有状态 KIE 会话中,之前调用 KIE 会话(之前的会话状态)的数据会在会话调用之间保留,而在无状态 KIE 会话中,数据将被丢弃。
在运行有状态 KIE 会话后,请确保调用 dispose () 方法,以便在会话调用之间没有内存泄漏。
有状态 KIE 会话通常用于以下用例:
- 监控,如监控库存市场并自动化销售流程
- 诊断,如运行错误查找进程或诊断诊断过程
- 日志流,如 parcel 跟踪和交付配置
- 确保合规性,例如验证市场的法律性
例如,请考虑以下触发的警报数据模型和 DRL 规则示例:
sprinklers 的数据模型并触发警报
public class Room {
private String name;
// Getter and setter methods
}
public class Sprinkler {
private Room room;
private boolean on;
// Getter and setter methods
}
public class Fire {
private Room room;
// Getter and setter methods
}
public class Alarm { }
激活 sprinklers 和警报的 DRL 规则集示例
rule "When there is a fire turn on the sprinkler"
when
Fire($room : room)
$sprinkler : Sprinkler(room == $room, on == false)
then
modify($sprinkler) { setOn(true) };
System.out.println("Turn on the sprinkler for room "+$room.getName());
end
rule "Raise the alarm when we have one or more fires"
when
exists Fire()
then
insert( new Alarm() );
System.out.println( "Raise the alarm" );
end
rule "Cancel the alarm when all the fires have gone"
when
not Fire()
$alarm : Alarm()
then
delete( $alarm );
System.out.println( "Cancel the alarm" );
end
rule "Status output when things are ok"
when
not Alarm()
not Sprinkler( on == true )
then
System.out.println( "Everything is ok" );
end
对于发生 触发时,会打开 sprinkler 规则,当发生触发时,会为该空间创建 Fire 类的实例,并插入到 KIE 会话中。规则为 Fire 实例中的特定 空间 添加一个约束,以便仅检查该房间的 sprinkler。当执行此规则时,sprinkler 会激活。其他示例规则决定何时激活或取消激活警报。
无状态 KIE 会话依赖于标准 Java 语法来修改字段,而有状态 KIE 会话依赖于规则中的 modify 语句来通知变化的决策引擎。然后,决策引擎会对更改和评估影响后续规则执行的原因。此过程是决策引擎使用 inference 和 事实维护 的一部分,在有状态 KIE 会话中非常重要。
在本例中,Red Hat Process Automation Manager 项目的 ~/resources 文件夹中的示例规则和所有其他文件会使用以下代码构建:
创建 KIE 容器
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
此代码编译类路径上找到的所有规则文件,并在 KieContainer 中添加此编译(一个 KieModule 对象)的结果。
最后,Ki eSession 对象从 KieContainer 实例化,并根据指定的数据执行:
实例化有状态 KIE 会话并输入数据
KieSession ksession = kContainer.newKieSession();
String[] names = new String[]{"kitchen", "bedroom", "office", "livingroom"};
Map<String,Room> name2room = new HashMap<String,Room>();
for( String name: names ){
Room room = new Room( name );
name2room.put( name, room );
ksession.insert( room );
Sprinkler sprinkler = new Sprinkler( room );
ksession.insert( sprinkler );
}
ksession.fireAllRules();
�制�输出
> Everything is ok
添加数据后,决策引擎完成所有模式匹配但没有执行规则,因此会显示配置的验证消息。随着新数据触发规则条件,决策引擎执行规则来激活警报,并稍后取消已激活的警报:
输入新数据来触发规则
Fire kitchenFire = new Fire( name2room.get( "kitchen" ) );
Fire officeFire = new Fire( name2room.get( "office" ) );
FactHandle kitchenFireHandle = ksession.insert( kitchenFire );
FactHandle officeFireHandle = ksession.insert( officeFire );
ksession.fireAllRules();
�制�输出
> Raise the alarm
> Turn on the sprinkler for room kitchen
> Turn on the sprinkler for room office
ksession.delete( kitchenFireHandle );
ksession.delete( officeFireHandle );
ksession.fireAllRules();
�制�输出
> Cancel the alarm
> Turn off the sprinkler for room office
> Turn off the sprinkler for room kitchen
> Everything is ok
在这种情况下,为返回的 FactHandle 对象保留一个引用。事实处理是对插入实例的内部引擎引用,并允许以后重新处理或修改实例。
如本例所示,来自之前有状态 KIE 会话的数据和结果(激活的警报)会影响后续会话的调用(固定)。