19.3. 状态示例决策(转发链和冲突解析)


State 示例决定集演示了决策引擎如何使用 forward 链,以及对工作内存中事实的任何更改,以解决序列中的规则的执行冲突。该示例重点通过您可以在规则中定义的可变值或通过电缆组解决冲突。

以下是 State 示例的概述:

  • 名称状态
  • 主类org.drools.examples.state.StateExampleUsingSalience,org.drools.examples.state.StateExampleUsingAgendaGroup (in src/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
  • 完æˆ�

状态类

public class State {
    public static final int NOTRUN   = 0;
    public static final int FINISHED = 1;

    private final PropertyChangeSupport changes =
        new PropertyChangeSupport( this );

    private String name;
    private int    state;

    ... setters and getters go here...
}
Copy to Clipboard Toggle word wrap

State 示例包含两个相同的示例版本,用于解决规则执行冲突:

  • StateExampleUsingSalience 版本,它通过使用规则 salience 解决冲突
  • StateExampleUsingAgendaGroups 版本,该版本使用规则购买组解决冲突

状态示例的两个版本都涉及四个状态对象: ABCD最初,其状态设置为 NOTRUN,这是示例使用的构造器的默认值。

使用 salience 的 state 示例

State 示例的 StateExampleUsingSalience 版本在规则中使用 salience 值来解决规则执行冲突。在激活队列中排序时,具有较高 salience 值的规则会被赋予更高的优先级。

示例将每个 State 实例插入到 KIE 会话中,然后调用 fireAllRules ()

Salience State 示例执行

final State a = new State( "A" );
final State b = new State( "B" );
final State c = new State( "C" );
final State d = new State( "D" );

ksession.insert( a );
ksession.insert( b );
ksession.insert( c );
ksession.insert( d );

ksession.fireAllRules();

// Dispose KIE session if stateful (not required if stateless).
ksession.dispose();
Copy to Clipboard Toggle word wrap

要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.state.StateExampleUsingSalience 类。

执行后,以下输出会出现在 IDE 控制台窗口中:

IDE 控制台中的 Salience State 示例输出

A finished
B finished
C finished
D finished
Copy to Clipboard Toggle word wrap

存在四个规则。

首先,"Bootstrap" 规则将触发,将 A 设置为状态 FINISHED,然后会导致 B 将其状态更改为 FINISHED。对象 CD 都依赖于 B,从而导致由 salience 值解析的冲突。

为更好地了解本例的执行流程,您可以将审计日志文件从 target/state.log 加载到 IDE debug 视图或 审计 视图(例如,在一些 IDE 中的 Window Show View 中)。

在本例中,审计视图显示 对象 A 处于 NOTRUN 的断言激活 "Bootstrap" 规则,而其他对象的断言无效。

图 19.5. Salience State 示例审计视图

salience State 示例中的规则"Bootstrap"

rule "Bootstrap"
  when
    a : State(name == "A", state == State.NOTRUN )
  then
    System.out.println(a.getName() + " finished" );
    a.setState( State.FINISHED );
end
Copy to Clipboard Toggle word wrap

"Bootstrap" 规则的执行会将 A 的状态更改为 FINISHED,这会激活规则 "A to B "。

在 salience State 示例中的规则 "A to B"

rule "A to B"
  when
    State(name == "A", state == State.FINISHED )
    b : State(name == "B", state == State.NOTRUN )
  then
    System.out.println(b.getName() + " finished" );
    b.setState( State.FINISHED );
end
Copy to Clipboard Toggle word wrap

规则 "A to B" 的执行会将 B 的状态更改为 FINISHED,这会激活规则 "B to C""B to D",将其激活放在决策引擎上。

在 salience State 示例中,规则 "B to C" 和 "B to D"

rule "B to C"
    salience 10
  when
    State(name == "B", state == State.FINISHED )
    c : State(name == "C", state == State.NOTRUN )
  then
    System.out.println(c.getName() + " finished" );
    c.setState( State.FINISHED );
end

rule "B to D"
  when
    State(name == "B", state == State.FINISHED )
    d : State(name == "D", state == State.NOTRUN )
  then
    System.out.println(d.getName() + " finished" );
    d.setState( State.FINISHED );
end
Copy to Clipboard Toggle word wrap

此时,这两个规则都可能会触发,因此规则都冲突。冲突解析策略使决策引擎能够决定要触发的规则。规则 "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"

rule "B to C"
    agenda-group "B to C"
    auto-focus true
  when
    State(name == "B", state == State.FINISHED )
    c : State(name == "C", state == State.NOTRUN )
  then
    System.out.println(c.getName() + " finished" );
    c.setState( State.FINISHED );
    kcontext.getKnowledgeRuntime().getAgenda().getAgendaGroup( "B to D" ).setFocus();
end
Copy to Clipboard Toggle word wrap

数字组 "B 到 D" 上的规则"B 到 C " 调用 setFocus (),启用它触发的活动规则,然后使规则 "B 到 D" 触发。

模拟组状态示例中的规则"B 到 D"

rule "B to D"
    agenda-group "B to D"
  when
    State(name == "B", state == State.FINISHED )
    d : State(name == "D", state == State.NOTRUN )
  then
    System.out.println(d.getName() + " finished" );
    d.setState( State.FINISHED );
end
Copy to Clipboard Toggle word wrap

要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.state.StateExampleUsingAgendaGroups 类。

执行后,以下输出会出现在 IDE 控制台窗口中(与 State 示例的 salience 版本相同):

IDE 控制台中的组状态示例输出

A finished
B finished
C finished
D finished
Copy to Clipboard Toggle word wrap

State 示例中的动态事实

此状态示例中的另一个显著概念是根据实施 PropertyChangeListener 对象的对象 使用动态事实。要让决策引擎查看并对事实属性更改的响应,应用程序必须通知发生了变化的决策引擎。您可以使用 modify 语句明确在规则中配置此通信,或者通过指定事实实现 PropertyChangeSupport 接口来隐式配置。

本例演示了如何使用 PropertyChangeSupport 接口来避免对规则中显式 修改 语句的需求。要使用这个接口,请确保您的事实以类 org.drools.example.State 实施它的方式实现 PropertyChangeSupport,然后使用 DRL 规则文件中的以下代码将决策引擎配置为侦听这些事实上的属性更改:

声明动态事实

declare type State
  @propertyChangeSupport
end
Copy to Clipboard Toggle word wrap

当使用 PropertyChangeListener 对象时,每个 setter 必须为通知实施额外的代码。例如,以下 state 设置器位于类 org.drools.examples 中:

带有 PropertyChangeSupport 的 setter 示例

public void setState(final int newState) {
    int oldState = this.state;
    this.state = newState;
    this.changes.firePropertyChange( "state",
                                     oldState,
                                     newState );
}
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat