1

现在,在我的 drools 项目中,我在不同的 DRL 文件中有两组规则,这些规则由议程组拆分。对于议程组“preCheck”,我为该议程组中的每条规则设置自动焦点为真。例子:

rule "preCheckDuplicate"
    agenda-group "preCheck"
    auto-focus true
    no-loop true
    salience 50
    when
        $f : IngestFileMetadata(isDuplicate.equalsIgnoreCase("True"))
    then
        $f.setIsDuplicate("True");
end

对于另一个议程组 - “defaultRules” - 规则没有设置自动焦点属性。例子:

rule "duplicate file default"
    agenda-group "defaultRules"
    activation-group "isDuplicate"
    no-loop true
    salience 0
    when
        $f : IngestFileMetadata(isDuplicate.equals("True"))
    then
        insert(createResponse($f));
end

通过其余 API 调用规则时,我还尝试通过 JSON 有效负载将焦点设置为“preCheck”议程组。例子:

{
  "lookup": "defaultStatelessKieSession",
  "set-focus": "preCheck",
  "commands": [
    {
      "insert": {
        "out-identifier": "IngestFileMetadata",
        "return-object": "true",
        "entry-point": "DEFAULT",
        "object": {
          "com.hms.ingestion.rules.IngestFileMetadata": {
              * * * * * data attributes here * * * * *
          }
        }
      }
    },
    {
      "fire-all-rules": {"out-identifier": "fired"}
    },
    {
      "query": {"name": "rulesResponses", "out-identifier": "rulesResponses"}
    }
  ]
}

但是,在执行规则时,似乎首先评估“defaultRules”议程组中的规则。我不知道为什么。我对口水比较陌生,所以我完全有可能没有正确理解议程组的概念,但我确信这种设计将确保“preCheck”规则首先评估。

任何人都可以提供有关为什么没有发生这种情况的任何见解吗?如果我需要提供更多详细信息,我可以。

提前致谢。

4

2 回答 2

3

议程组允许您将规则放入组中,并将这些组放入堆栈中。堆栈具有推送/弹出行为。在开始讨论如何使用议程组之前,我想说配置议程组取决于KieSession您在规则引擎中使用的类型。对于有状态的 Session,可以直接调用ksession.getAgenda().getAgendaGroup( "preCheck" ).setFocus();. 对于无状态会话,您必须声明一个显式规则以将会话的焦点设置为特定的Agenda. 您可以使用以下规则设置议程Stateless Session

 rule "global"
 salience 100
    when
        $f : IngestFileMetadata()
    then
        drools.setFocus($f.getAgenda());
end

注意:您必须找到某种方法来获取规则文件中的议程变量。在上面的示例中,getAgenda() 是 IngestFileMetadata 类中的一个方法,它返回 String 类型的议程值

于 2018-03-28T08:52:34.117 回答
0

事实证明,一旦我在预检查规则期间更新了属性,我的问题就必须对我的事实进行显式更新。这解决了问题。

于 2018-04-25T17:20:54.237 回答