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

时间:2016-04-21 16:36:05

标签: java drools rule-engine complex-event-processing drools-fusion

我最近注意到了drools规则的一些奇怪行为。我上课了HeartRate,它有以下几个字段:

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

我想将字段heartRate更改为heartrate并更改规则中的字段名称,以便我的新规则立即生效:

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。但是当我使用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 个答案:

答案 0 :(得分:1)

您的类应该遵循Java Beans规范,如果您在约束中使用getSomeField,Drools将尝试找到someField私有实例字段本身的调用方式并不重要。

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

答案 1 :(得分:0)

我发现了我的错误,我忘了改变字段心率的get / set方法。