Проблема с передачей объекта Drools в DRL

У меня проблема, когда после того, как я установил для объекта значение «FAILED» в первом правиле, но при запуске второго правила значение по-прежнему указывает на исходное значение, которое является «PASS». Обратите внимание, что значение передается от клиента kie.

    rule "1st rule"
    dialect "java"
    when
    $ruleEngine:RuleEngine()
    then
    OutputObject outputObject = new OutputObject();
    outputObject.setResult("FAIL" );
    $ruleEngine.setOutputObject(outputObject);      
    insert ($ruleEngine);
end

rule "2nd rule"
    dialect "java"
    when
    $ruleEngine:RuleEngine(     
    ( String.valueOf($ruleEngine.getOutputObject.getResult()).equals("PASS") )  //=====> the value is still PASS            
    )

    then
    System.out.println("output object= = " + $ruleEngine.getOutputObject().getResult().equals("FAIL"));  // ===> is true      
    System.out.println("output object:" + $ruleEngine.getOutputObject().getResult()); // ==> object is FAIL ?? Why?

end

Вывод правила

output object==true
output object:FAIL

Вопрос 1) Почему значение результата установлено на "FAIL", но выполняется 2-е правило во время проверки "when", тогда значение результата все еще "PASS"

Вопрос 2) Как я могу получить значение результата, установленное как «FAIL» во время проверки 2-го правила «when»?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
578
1

Ответы 1

В Drools есть специальная «функция» для изменения фактов, и это не insert. Что вы делаете в первом правиле, так это снова вставляете факт в сеанс (вызывая путаницу для Drools). Вы ищете метод modify:

rule "1st rule"
dialect "java"
when
  $ruleEngine:RuleEngine(outputObject!.result != "FAIL")
then
  OutputObject outputObject = new OutputObject();
  outputObject.setResult("FAIL" );

  modify($ruleEngine){
    setOutputObject(outputObject)
  };
end

rule "2nd rule"
dialect "java"
when
  $ruleEngine:RuleEngine( outputObject!.result == "PASS" )
then
  //...
end

Надеюсь, поможет,

Привет, когда я добавил функцию изменения, правилом было продолжать перезагружать .. В документации упоминается использование модификации, но я не совсем понимаю, почему она будет перезагружать все снова и снова. Во-первых, важно понять, почему вы бы использовали вышеуказанный шаблон. У вас может быть много правил в разных группах потока правил. Когда правила изменяют рабочую память и другие правила, расположенные ниже вашего RuleFlow (в разных группах потока правил), необходимо переоценить, использование модификации имеет решающее значение. Однако вы не хотите, чтобы другие правила в той же группе потока правил рекурсивно накладывали активации друг на друга.

Banana Tech 13.06.2018 09:25

Точно так же, как insert потенциально вызовет оценку всех ваших правил, modify будет работать точно так же. После изменения факта все правила, относящиеся к этому факту, будут повторно оценены (включая то же правило, которое изменило объект). Так работает логический вывод в Drools (и других механизмах правил). Обратите внимание, что я изменил условие в первом правиле, чтобы оно не запускалось повторно при изменении. Если вы не хотите, чтобы Drools узнал о модификации, просто не используйте операцию modify.

Esteban Aliverti 13.06.2018 12:25

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

Esteban Aliverti 13.06.2018 20:53

Здесь нет ничего хорошего. Когда мне удалось установить функцию изменения, как вы предложили. Он отлично работает на eclipse, но работает с drool core api 6.0.1, но не работает на drools core api 7.5 с использованием swagger и Kie Server.

Banana Tech 19.06.2018 10:07

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