首页 文章

议程小组在Drools中没有按预期工作

提问于
浏览
0

现在,在我的drools项目中,我在单独的DRL文件中有两组规则,这些规则按议程组分开 . 对于议程组“preCheck”,我将自动焦点设置为该议程组中每个规则的true . 例:

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”议程组中的规则 . 我不知道为什么 . 我对drools相对较新,所以我完全有可能无法正确理解议程组的概念,但我确信这种设计可以确保“preCheck”规则首先进行评估 .

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

提前致谢 .

2 回答

  • 0

    议程组允许您将规则放入组中,并将这些组放入堆栈中 . 堆栈具有推/弹性行为 . 在首先讨论如何使用议程组之前,我想说配置议程组取决于您在规则引擎中使用的KieSession的类型 . 对于有状态会话,您可以通过调用ksession.getAgenda() . getAgendaGroup(“preCheck”) . setFocus();来直接配置它 . 对于无状态会话,您必须声明一个明确的规则,以将会话的焦点设置为特定的议程 . 您可以使用以下规则在无状态会话中设置议程:

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

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

  • 0

    结果我的问题是,在我的预检查规则中更新属性后,必须对我的事实发出明确的更新 . 这解决了这个问题 .

相关问题