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

Drools规则语言:类字段的奇怪行为

桂鑫鹏
2023-03-14

我最近注意到一些流口水规则的奇怪行为。我有班级心率,它有以下字段:

int heartRate;
Date timeStamp;
String macAddress;

我的规则文件如下:

import drools.HeartRate
import drools.Action

declare HeartRate
    @role(event)
end

rule "HEARTRATE RULE 1"
when
    $heartRate : HeartRate(heartRate >= 180) from entry-point "entryHeartRate"
then
    Action.handleAction(1,"Heart rate is to high!");
end

我想将字段<代码>心率更改为<代码>心率,并在我的规则中更改字段名称,以便我的新规则现在是:

rule "HEARTRATE RULE 1"
when
    $heartRate : HeartRate(heartrate >= 180) from entry-point "entryHeartRate"
then
    Action.handleAction(1,"Heart rate is to high!");
end

但这会产生错误,即drools无法解析该字段的心率。但是,当我将规则更改回原来的规则时,使用心率(heartRate),它可以正常工作,尽管这样的字段已经不存在了。我得到以下错误:

[Unable to Analyse Expression heartrate >= 180:
[Error: unable to resolve method using strict-mode: drools.HeartRate.heartrate()]
Exception in thread "main" java.lang.RuntimeException: Unable to compile drl".
[Near : {... heartrate >= 180 ....}]
             ^
[Line: 26, Column: 4] : [Rule name='HEARTRATE RULE 1']
]
    at drools.Main.initDrools(Main.java:53)
    at drools.Main.main(Main.java:39)
C:\Users\Tim Deweert\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1

共有2个答案

贡俊
2023-03-14

我发现了错误,忘记更改字段心率的获取/设置方法。

南宫鸿晖
2023-03-14

您的类应该遵循JavaBeans规范,如果您在约束中使用某个字段,Drools将尝试定位get某个字段。如何调用私有实例字段本身并不重要。

如果该字段是公共字段,则将在名称匹配时使用该字段。否则,如果getter的名称根据上面给出的规则匹配,则使用getter。

 类似资料:
  • 我是一个流口水的新手(6.3版),我很难想出一个具体的规则。我有一个名为Steps的类,只有一个简单的字段

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

  • 我有以下规则,当心率保持在160以上5分钟时触发。 我的心率类别有以下字段: 我想要的是能够在ruleListener中获得macAddress。然而,这将返回一个空的hashmap。所以我的问题是如何返回心率的macAddress?

  • 我知道Drools中的“显着性”提供了对规则执行顺序的控制。但上面是一个例子,说明了当“显着性”不再能帮助我时所面临的问题。 在这里,我有三条规则正在相继执行: 我期望第三条规则被触发,并且控制台中有“规则被触发”行,但它没有被执行。 据我所知,问题在于规则评估阶段,当所有三个规则在执行前同时评估,然后才根据它们的“显着性”回合执行。 在评估的那一刻,$resource1.amount是5,这就是