如何解决Drools:如何编写在入口点没有数据时会命中的规则
我是流口水的新手。我希望传感器数据能够从跟踪设备(例如标签设备)发送数据。我正在使用Drools 入口来跟踪传感器数据。我需要基于此传感器数据对某些事件进行警报。
DRL文件如下
import com.sample.AlertRuleModel;
declare AlertRuleModel
@role( event )
@timestamp( timespamp )
end
rule "No signals are coming from any entry-point for more than 10s"
when
$f : AlertRuleModel() from entry-point "AlertRuleStream"
not(AlertRuleModel(this != $f,this after[0s,10s] $f) from entry-point "AlertRuleStream")
then
$f.setRuleId(1);
<Do alert here>
end
rule "Rule on Tag1 has not been in zone1 for more than 1 minutes"
when
$f : AlertRuleModel( tagId == 1,zoneId == 1 ) from entry-point "AlertRuleStream"
not(AlertRuleModel(this != $f,tagId == 1,zoneId != 1,1m] $f) from entry-point "AlertRuleStream")
then
$f.setRuleId(2);
<Do alert here>
end
Java代码
kSession = RuleExecutionService.getKieSession(packetProcessorData.getAlertRuleDrlPath());
ruleStream = kSession.getEntryPoint("AlertRuleStream");
kSession.addEventListener(new DefaultAgendaEventListener() {
public void afterMatchFired(AfterMatchFiredEvent event) {
super.afterMatchFired(event);
onPostExecution(event,RuleTypeEnum.ALERT_RULE.getName());
}
});
new Thread() {
@Override
public void run() {
kSession.fireUntilHalt();
}
}.start();
流数据插入部分
private BlockingQueue<AlertRuleModel> alertFactQueue;
.
.
AlertRuleModel alertRuleModel = null;
while (true) {
alertRuleModel = alertFactQueue.poll(1,TimeUnit.SECONDS);
if (alertRuleModel != null) {
//LOGGER.debug("Inserting alertRuleModel into \"AlertRuleStream\"");
ruleStream.insert(alertRuleModel);
continue;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
LOGGER.error("Exception while sleeping thread during alertFactQueue polling..",e);
}
}
但是当我运行应用程序时,
- 第一个规则“在10s内没有任何信号从任何入口点发出”根本没有命中。我不知道为什么,请告诉我我做错了什么还是语法错误是第一个规则。
- 在第二条规则“ Tag1不在zone1中超过1分钟”的情况下,当我通过tagId == 1和zoneId == 1传递事实时,它总是立即被击中。我尝试了不同的时间间隔,例如之后[0s,10m] 。但是在传递具有上述值的事实后,它仍然会立即命中。
请告诉我我在哪里犯错误..?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。