Группы Повестки дня не работают должным образом в Drools

Прямо сейчас, в моем проекте drools у меня есть две группы правил в отдельных файлах DRL, которые разделены по группам повестки дня. Для группы повестки дня "Предварительная проверка" я устанавливаю автофокус на 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 остальных я также пытаюсь сосредоточиться на группе повестки дня "preCheck" через полезную нагрузку JSON. Пример:

{
  "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" оцениваются первыми. Понятия не имею почему. Я относительно новичок в слюнях, поэтому вполне возможно, что я не правильно понимаю концепцию групп повестки дня, но я был уверен, что этот дизайн будет гарантировать, что правила "предварительной проверки" будут оцениваться в первую очередь.

Может ли кто-нибудь дать представление о том, почему этого не происходит? Если мне нужно предоставить более подробную информацию, я могу.

Заранее спасибо.

2 ответа

Решение

Оказывается, моя проблема заключалась в том, что я должен был выполнить явное обновление моего факта, как только я обновил атрибуты во время моего правила предварительной проверки. Это решило проблему.

Группы повестки дня позволяют размещать правила в группы и помещать эти группы в стек. Стек имеет push/pop поведение. Прежде чем перейти к тому, как использовать группу повестки дня, я хочу сказать, что настройка группы повестки дня зависит от того, какой тип KieSession вы используете в вашем правиле двигателя. Для сеанса с сохранением состояния вы можете напрямую настроить его, вызвав ksession.getAgenda().getAgendaGroup( "preCheck" ).setFocus();, Для сеанса без состояния вы должны объявить явное правило, чтобы установить фокус сеанса на конкретный Agenda, Вы можете использовать приведенное ниже правило, чтобы установить повестку дня в Stateless Session:

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

Примечание. Вам нужно найти способ получить переменную повестки дня в файле правил. В приведенном выше примере getAgenda() является методом в вашем классе IngestFileMetadata и возвращает значение повестки дня типа String.

Другие вопросы по тегам