84.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 在特定 Red Hat Decision Manager 项目的 KIE 模块描述符文件中启用连续模式(
kmodule.xml):Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要配置连续模式以使用动态索引,请使用以下选项之一:
-
将系统属性
drools.sequential.agenda设置为动态。 以编程方式创建 KIE 基础时设定连续日程表:
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 和在规则集中的位置排序。
- 每个可能规则匹配的元素会被创建。元素位置表示执行顺序。
- 节点内存被禁用,但 right-input 对象内存除外。
-
left-input 适配器节点传播断开连接的,在
Command对象中引用带有该节点的对象。Command对象添加到工作内存中的列表中,以便稍后执行。 -
所有对象都会被断言,
然后检查并执行命令对象列表。 - 执行列表的所有匹配都将添加到元素中,具体取决于规则的序列号。
- 包含匹配项的元素按顺序执行。如果您设置了最多规则执行数,则决策引擎不会激活执行日程表中的相应数量。
在连续模式中,LeftInputAdapterNode 节点创建一个 Command 对象,并将其添加到决策引擎的工作内存中。此命令对象包含对 LeftInputAdapterNode 节点和传播对象的引用。这些引用在插入时停止任何左侧输入传播,因此正确的输入传播不需要尝试加入左侧输入。引用还避免了对 left-input 内存的需求。
所有节点都关闭其内存,包括 left-input tuple 内存,但不包括正确的输入对象内存。完成所有断言,并填充了所有对象的正确输入内存后,决策引擎会迭代 LeftInputAdatperNode Command 对象列表。对象传播网络,尝试加入正确的输入对象,但它们不会在左边输入中保留。
安排优先队列的日程安排方式由每条规则的一个元素替代。RuleTerminalNode 节点的序列号表示放置匹配的元素。在 所有命令 对象完成后,会检查元素并执行现有的匹配项。为提高性能,则会保留元素中第一个和最后填充的单元。
创建该网络时,每个 RuleTerminalNode 节点都会根据其 salience 编号及其添加到网络中的顺序接收序列号。
right-input 节点 Imories 通常是用于删除快速对象的哈希映射。因为不支持删除对象,所以当对象的值没有索引时,Phreak 使用对象列表。对于大量对象,索引的散列映射可以提高性能。如果对象只有一个实例,Phreak 使用对象列表而不是索引。