【问题标题】:How to remove default focus to the MAIN agenda, in Drools?如何在 Drools 中删除对 MAIN 议程的默认焦点?
【发布时间】:2017-07-25 18:00:22
【问题描述】:

我正在使用 Drools 6.2.0

我想将我的规则分为 3 组(FIRST、MAIN、LAST), 并按以下顺序执行:

  • 第一
  • 主要
  • 最后

为此,我在必要的规则中使用了 agenda-group "FIRST"agenda-group "LAST"。其他规则默认属于 MAIN 议程。

我正在使用此代码来指定顺序:

private void configureAgendas() {
    Agenda agenda = session.getAgenda();

    agenda.getAgendaGroup("LAST").setFocus();
    agenda.getAgendaGroup("MAIN").setFocus();
    agenda.getAgendaGroup("FIRST").setFocus();
}

我的问题是 MAIN 议程总是在 END 执行。 所以,我要执行两次主要议程:

  • 第一
  • 主要
  • 最后
  • MAIN(再次执行。我想跳过最后一次执行)

我怎样才能做到这一点?

如果我无法禁用 MAIN 议程的自动执行, 如何创建将成为最后执行的规则的规则?

注意:我已经尝试使用 salience Integer.MIN_VALUE,但我仍然有在此之后执行 MAIN 议程的规则。

【问题讨论】:

    标签: drools kie


    【解决方案1】:

    如果您确实需要以这种方式控制规则执行,则应完全避免使用默认组,并将所有规则放在“一”、“二”、“三”之一中。

    请注意,在 rule ... end 之外的规则属性在取消或更改之前对所有后续规则都有效,因此无需为每个规则设置规则组。

    (奇怪的是,在 MAIN 和 LAST 用完之后仍然有 MAIN 规则触发。我不喜欢这种情况。)

    编辑:另一种选择是在 LAST 中添加一条优先级最低的规则,以将焦点更改为 FIRST。您可能需要另一个来“倒回”LAST 中的最后一条规则,以便在下一轮结束时再次触发。

    【讨论】:

    • 谢谢@laune,我没想到也会出现这种行为。我的问题是最糟糕的,因为我无法更改其他一百条规则,因为它们仍然是在生产数据库中创建的,等等。所以,我需要使用 MAIN 议程 + 我的议程中的规则......
    猜你喜欢
    • 2011-04-17
    • 2015-05-17
    • 1970-01-01
    • 2019-05-05
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多