19.3. 状态示例决策(转发链和冲突解析)
State 示例决定集演示了决策引擎如何使用 forward 链,以及对工作内存中事实的任何更改,以解决序列中的规则的执行冲突。该示例重点通过您可以在规则中定义的可变值或通过电缆组解决冲突。
以下是 State 示例的概述:
-
名称 :
状态
-
主类 :
org.drools.examples.state.StateExampleUsingSalience
,org.drools.examples.state.StateExampleUsingAgendaGroup
(insrc/main/java
) -
模块 :
drools-examples
- 类型 :Java 应用程序
-
规则文件:
org.drools.examples.state114.drl
(在src/main/resources
中) - 目标 :通过规则 salience 和 sales 组来演示转发链和冲突解析
转发链规则系统是一种数据驱动的系统,它以决策引擎工作内存中的事实开始,并对这一事实做出更改。当对象插入到工作内存中时,因更改计划执行而满足的任何规则条件。
相反,反向链规则系统是一个目标驱动的系统,从决策引擎尝试满足的公式开始,通常使用递归。如果系统无法访问语音或目标,它会搜索子组,这是完成当前目标的一部分。系统会继续这个过程,直到满足初始目标或满足所有子状态为止。
Red Hat Process Automation Manager 中的决策引擎使用正向和后链来评估规则。
下图演示了,决策引擎如何使用转发链和逻辑流中的向链段来评估规则:
图 19.4. 使用正向和后链的规则评估逻辑
在 State 示例中,每个 State
类都有其名称及其当前状态字段(请参阅类 org.drools.examples.state.State
)。以下状态是每个对象的两个可能的状态:
-
NOTRUN
-
完�
状态类
State 示例包含两个相同的示例版本,用于解决规则执行冲突:
-
StateExampleUsingSalience
版本,它通过使用规则 salience 解决冲突 -
StateExampleUsingAgendaGroups
版本,该版本使用规则购买组解决冲突
状态示例的两个版本都涉及四个状态对象: A
、B
、C
和 D
。最初,其状态设置为
NOTRUN
,这是示例使用的构造器的默认值。
使用 salience 的 state 示例
State 示例的 StateExampleUsingSalience
版本在规则中使用 salience 值来解决规则执行冲突。在激活队列中排序时,具有较高 salience 值的规则会被赋予更高的优先级。
示例将每个 State
实例插入到 KIE 会话中,然后调用 fireAllRules ()
。
Salience State 示例执行
要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.state.StateExampleUsingSalience
类。
执行后,以下输出会出现在 IDE 控制台窗口中:
IDE 控制台中的 Salience State 示例输出
A finished B finished C finished D finished
A finished
B finished
C finished
D finished
存在四个规则。
首先,"Bootstrap"
规则将触发,将 A
设置为状态 FINISHED
,然后会导致 B
将其状态更改为 FINISHED
。对象 C
和 D
都依赖于 B
,从而导致由 salience 值解析的冲突。
为更好地了解本例的执行流程,您可以将审计日志文件从 target/state.log
加载到 IDE debug 视图或 审计 视图(例如,在一些 IDE 中的 Window
在本例中,审计视图显示 对象 A
处于 NOTRUN
的断言激活 "Bootstrap"
规则,而其他对象的断言无效。
图 19.5. Salience State 示例审计视图
salience State 示例中的规则"Bootstrap"
"Bootstrap"
规则的执行会将 A
的状态更改为 FINISHED
,这会激活规则 "A to B
"。
在 salience State 示例中的规则 "A to B"
规则 "A to B"
的执行会将 B
的状态更改为 FINISHED
,这会激活规则 "B to C"
和 "B to D"
,将其激活放在决策引擎上。
在 salience State 示例中,规则 "B to C" 和 "B to D"
此时,这两个规则都可能会触发,因此规则都冲突。冲突解析策略使决策引擎能够决定要触发的规则。规则 "B to C"
具有更高的 salience 值(10
而不是默认的 salience 值 0
),因此它会首先触发,将对象 C
修改为状态 FINISHED
。
IDE 中的 审计 视图显示规则 "A to B"
中的 State
对象的修改,这会导致两个激活冲突。
您还可以使用 IDE 中的 Agenda View 来调查决策引擎模拟的状态。在本例中,Agenda View 显示规则 "A to B"
中的断点,以及带有两个冲突规则的电缆状态。规则 "B to D"
最后触发,将对象 D
修改为状态 FINISHED
。
图 19.6. Salience State 示例 Agenda View
使用电缆组的状态示例
State 示例的 StateExampleUsingAgendaGroups
版本使用规则中的 sales 组来解决规则执行冲突。通过电缆组,您可以对决策引擎人员进行分区,以提供更多对规则组的执行控制。默认情况下,所有规则都位于 products 组 MAIN
中。您可以使用 sales -group
属性为规则指定不同的 sales 组。
最初,工作内存将其重点放在电缆组 MAIN
上。只有组收到重点时,才会触发电缆组中的规则。您可以使用 setFocus ()
或 rule 属性 auto-focus
设置重点。auto-focus
属性可让规则在匹配并激活规则时自动为其电缆组赋予一个重点。
在本例中,auto-focus
属性使规则 "B 到 C"在"
B 到 D"
之前触发。
模拟组状态示例中的规则"B 到 C"
数字组 "B 到
调用 D" 上的规则"B 到 C
"setFocus ()
,启用它触发的活动规则,然后使规则 "B 到 D"
触发。
模拟组状态示例中的规则"B 到 D"
要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.state.StateExampleUsingAgendaGroups
类。
执行后,以下输出会出现在 IDE 控制台窗口中(与 State 示例的 salience 版本相同):
IDE 控制台中的组状态示例输出
A finished B finished C finished D finished
A finished
B finished
C finished
D finished
State 示例中的动态事实
此状态示例中的另一个显著概念是根据实施 PropertyChangeListener
对象的对象 使用动态事实。要让决策引擎查看并对事实属性更改的响应,应用程序必须通知发生了变化的决策引擎。您可以使用 modify
语句明确在规则中配置此通信,或者通过指定事实实现 PropertyChangeSupport
接口来隐式配置。
本例演示了如何使用 PropertyChangeSupport
接口来避免对规则中显式 修改
语句的需求。要使用这个接口,请确保您的事实以类 org.drools.example.State
实施它的方式实现 PropertyChangeSupport
,然后使用 DRL 规则文件中的以下代码将决策引擎配置为侦听这些事实上的属性更改:
声明动态事实
declare type State @propertyChangeSupport end
declare type State
@propertyChangeSupport
end
当使用 PropertyChangeListener
对象时,每个 setter 必须为通知实施额外的代码。例如,以下 state
设置器位于类 org.drools.examples
中:
带有 PropertyChangeSupport 的 setter 示例