81.3. Phreak 中的顺序模式
连续模式是决策引擎中的高级规则基础配置,由 Phreak 支持,使决策引擎能够按照决策引擎人员中列出的顺序评估规则一次,而无需考虑工作内存中的更改。在后续模式中,决策引擎忽略规则中的任何 插入
、修改
或更新
语句,并在单个序列中执行规则。因此,执行规则可能会更快,但重要的更新可能不适用于您的规则。
后续模式只适用于无状态 KIE 会话,因为有状态 KIE 会话本质上使用之前调用的 KIE 会话中的数据。如果您使用无状态 KIE 会话,并且希望执行规则来影响电缆中的后续规则,请不要启用后续模式。在决策引擎中默认禁用后续模式。
要启用后续模式,请使用以下选项之一:
-
将系统属性
drools.sequential
设置为true
。 在以编程方式创建 KIE 基础时启用后续模式:
KieServices ks = KieServices.Factory.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(SequentialOption.YES); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
KieServices ks = KieServices.Factory.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(SequentialOption.YES); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 KIE 模块描述符文件(
kmodule.xml
)中为特定 Red Hat Process Automation Manager 项目启用后续模式:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要将后续模式配置为使用动态电缆,请使用以下选项之一:
-
将系统属性
drools.sequential.agenda
设置为dynamic
。 在以编程方式创建 KIE 基础时设置后续 products 选项:
KieServices ks = KieServices.Factory.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(SequentialAgendaOption.DYNAMIC); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
KieServices ks = KieServices.Factory.get(); KieBaseConfiguration kieBaseConf = ks.newKieBaseConfiguration(); kieBaseConf.setOption(SequentialAgendaOption.DYNAMIC); KieBase kieBase = kieContainer.newKieBase(kieBaseConf);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
当您启用后续模式时,决策引擎会使用以下方法评估规则:
- 规则按照规则集中的 salience 和 location 进行排序。
- 每个可能的规则匹配都会创建一个元素。元素位置表示执行顺序。
- 节点内存被禁用,但正确的输入对象内存除外。
-
left-input 适配器节点传播断开连接,并在
Command
对象中引用带有该节点的对象。Command
对象添加到工作内存中的列表中,以便稍后执行。 -
所有对象都被断言,然后检查并执行
Command
对象列表。 - 所有执行列表的结果都根据规则的序列号添加到元素中。
- 包含匹配项的元素按顺序执行。如果您设置了最大规则执行数,则决策引擎不会激活执行者中的规则数量。
在后续模式中,LeftInputAdapterNode
节点会创建一个 Command
对象,并将其添加到决策引擎工作内存中的列表。此命令对象包含对 LeftInputAdapterNode
节点和传播对象的引用。这些引用会在插入时停止任何输入输入传播,因此右侧输入不需要尝试加入左输入。引用也会避免对左输入内存的需求。
所有节点都关闭其内存,包括左输入的元组内存,但不包括正确的输入对象内存。完成所有断言并且填充所有对象的正确输入内存后,决策引擎会迭代 LeftInputAdatperNode
Command
对象列表。对象传播网络,尝试加入右侧输入对象,但不会将它们保留在左面输入中。
具有调度元组的优先级队列的语音将被每个规则的元素替代。RuleTerminalNode
节点的序列号指示放置匹配项的元素。所有 Command
对象完成后,会检查元素并执行现有的匹配。为提高性能,保留元素中的第一个和最后一个填充的单元。
构建网络后,每个 RuleTerminalNode
节点都会根据其数量和添加到网络的顺序接收序列号。
右输入节点记住通常是用于快速删除对象的哈希映射。因为不支持删除对象,因此当对象值没有索引时,Phreak 使用对象列表。对于大量对象,索引的哈希映射可提供性能提高。如果对象只有几个实例,则 Phreak 使用对象列表而不是索引。