当前位置: 首页 > 知识库问答 >
问题:

Drools规则插入新事实并动态激发其他规则

鲁鹤轩
2023-03-14

我对drools和KIE服务器是新手。我遇到了一个问题,即如何通过触发规则RHS(then action)在工作记忆中插入新的事实,然后通过这些动态插入的事实激活其他规则。

我所期望的是,当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

如何实现触发规则插入新的事实并动态触发其他规则?提前感谢!

{
    "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"
            }
    }

    ]
}
{
  "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"
                }

共有1个答案

罗昱
2023-03-14

如果您不知道这些规则属性的用途,您应该阅读文档。然后,我想,你会意识到你可以移除它们。

salience 100 or 10
no-loop true or false
lock-on-active true
 类似资料:
  • 我对口水很陌生,从基础开始。这是一个设置; > 有一些规则文件 不同文件中的规则属于不同的议程组 所有规则都基于同一事实 在我的单元测试中,我获得了一个特定的“议程组”,设置焦点(

  • 我是Drools Fusion的新手,我想知道为什么我的规则不总是被取消。我用的是Drools 6.3。以下是我要插入的事件: 这是我的规则文件: 这是我的输出: 我预计我的规则将触发2次,并给出以下输出: 我可能忽略了一些事情,但我没有找到关于我的问题的太多信息。有人能解释一下这里到底发生了什么吗?非常感谢。

  • 我有一个多用途的传感器,每个传感器发送计步器数据。我有一个基于macAddress的规则文件,触发规则: My User只有一个字段,Steps事件有以下字段: 现在,当我为每个macAddress插入一个事件时,如果在过去一小时内使用该macAddress的用户的步骤数少于50,则规则将触发。因此,如果满足此条件,则该规则将为每个macAddress触发。但我希望规则只能为插入的步骤事件的mac

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例

  • null 我在上面试图指出的是,只有在执行第一个规则时,第二个规则才会执行。但是,正如我所理解的,规则的“如果”部分是在“然后”部分之前执行的,因此,第二条规则失败了。

  • 我是规则引擎新手,我的应用程序需要从文件系统动态加载xml文件中的规则,因为管理员可以在运行时创建规则。(Java) 我的问题是:有没有可能流口水?如果是,那么请分享知识,如果不是,那么还有其他选择吗?