java - Drools规则语言: strange behaviour with class fields

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

我最近注意到一些关于流口水规则的奇怪行为。我有 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

最佳答案

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

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

关于java - Drools规则语言: strange behaviour with class fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36775676/

相关文章:

java - 究竟什么是现场注入(inject)以及如何避免它?

java - spring - CrudRepository 和带有 transient 字段的 beans

java - 我的 JPanel 实例是否被处置(为什么?)

Java - Drools 验证对象值列表

java - Drools Fusion 支持持久的、长时间运行的事件

wolfram-mathematica - 过滤掉 Mathematica 中的子列表

java - 向图形添加功能

java - 将多个同一类的java对象插入到java中的drools中

database - 存储逻辑规则的适当数据结构和数据库模式是什么?

c# - 最灵活的 .NET 规则引擎