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 会话的数据和结果(激活的警报)会影响后续会话的调用(固定)。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部