Правила слюни вставляют новый факт и запускают другие правила динамически

Я новичок в слюни и ки-сервер. У меня возникла проблема с тем, как вставить новые факты в рабочую память с помощью правила RHS(затем действия), а затем активировать другие правила с помощью этих динамически внедряемых фактов.

Я ожидаю, что когда BaseFeature вставит в рабочую память извне и активирует RuleOne, внутри RuleOne "затем" будет вставлен новый факт RuleResult, и ожидается, что он активирует RuleTwo, но он не активирует RuleTwo, только RuleOne был активирован, это что-то я делаю не так?

Здесь у меня есть два правила и набор фактов:

ФАКТЫ Определение:

public class AppResult implements java.io.Serializable
{
   static final long serialVersionUID = 1L;

   private java.lang.String key;
   private java.lang.String value;

   //getters and setters ...
}


public class BaseFeature implements java.io.Serializable
{

   static final long serialVersionUID = 1L;

   private int age;

   //getters and setters ...
}

public class RuleResult implements java.io.Serializable
{

   static final long serialVersionUID = 1L;

   private java.lang.String ruleName;
   private java.lang.Long score;
   private boolean state;

   //getters and setters ...
}

Определение правила:

rule "RuleOne"
    dialect "mvel"
    salience 100
    no-loop true
    lock-on-active true
    when
        $b : BaseFeature( age < 22 || age > 40 )
    then
        RuleResult $r = new RuleResult();
        $r.setRuleName( "RuleOne" );
        $r.setState( false );
        insertLogical( $r );
end

rule "RuleTwo"
    dialect "mvel"
    no-loop false
    lock-on-active true
    salience 10
    when
        $r : RuleResult( ruleName == "RuleOne" , state == false )
        $a : AppResult( )
    then
        $a.setKey( "PASS" );
        $a.setValue( "false" );
end

как добиться того, чтобы правила запускали новые факты и запускали другие правила динамически? заранее спасибо!

Я использую kie-server(6.5 Final) для тестирования, а также POST и Reponse, как показано ниже:

СООБЩЕНИЕ:

{
    "lookup": "RuleChainTestStateless",
    "commands": [
    {
        "insert": {
            "return-object": false,
            "object": {
                "com.qf.rulechaintest.BaseFeature": {
                    "age": "10"
                }
            }
        }
    },

    {
        "insert": {
            "return-object": true,
            "out-identifier": "AppResult",
            "object": {
                "com.qf.rulechaintest.AppResult": {

                }
            }
        }
    },
    {
        "fire-all-rules": ""
    },
    {
            "get-objects":{
                "out-identifier":"allFactsInWrokingMemory"
            }
    }

    ]
}

réponse:

{
  "type": "SUCCESS",
  "msg": "Container RuleChainTest1.1 successfully called.",
  "result": {
    "execution-results": {
      "results": [
        {
          "key": "",
          "value": 1
        },
        {
          "key": "AppResult",
          "value": {
            "com.qf.rulechaintest.AppResult": {
              "key": null,
              "value": null
            }
          }
        },
        {
          "key": "allFactsInWrokingMemory",
          "value": [
            {
              "com.qf.rulechaintest.BaseFeature": {
                "age": 10
              }
            },
            {
              "com.qf.rulechaintest.AppResult": {
                "key": null,
                "value": null
              }
            },
            {
              "com.qf.rulechaintest.RuleResult": {
                "ruleName": "RuleOne",
                "score": null,
                "state": false
              }
            }
          ]
        }
      ],
      "facts": [
        {
          "key": "AppResult",
          "value": {
            "org.drools.core.common.DefaultFactHandle": {
              "external-form": "0:2:1542374590:1542374590:2:DEFAULT:NON_TRAIT:com.qf.rulechaintest.AppResult"
            }
          }
        }
      ]
    }
  }
}

Обратите внимание, что ответ:

"com.qf.rulechaintest.AppResult": {
              "key": null,
              "value": null
            }

что это должно быть:

"com.qf.rulechaintest.AppResult": {
                  "key": "PASS",
                  "value": "false"
                }

3 ответа

Попробуйте использовать функцию обновления "

затем

    RuleResult $r = new RuleResult();
    $r.setRuleName( "RuleOne" );
    $r.setState( false );
    update ( $r );

"

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

salience 100 or 10
no-loop true or false
lock-on-active true

Я согласен с laune, что вам следует прочитать, что означают атрибуты правила (см. Здесь в документации [1]). Я думаю, это потому, что у вас есть активная блокировка по правилам. Пожалуйста, посмотрите документы, которые я связал.

[1] https://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html/ch08.html

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