Drools
版本为6.2.0,我正在使用流模式。
我使用@timestamp告诉引擎使用事件属性的时间戳。
问题是WorkingMemory中的Facts数量越来越大,即使事实已经过期(10s),事实也不会撤回。
我尝试使用Pseudo Clock,但它也没有效果。
这是我的drl:
package test.drools
import test.drools.LogEntry;
declare LogEntry
@role(event)
@timestamp(callDateTime)
end
rule "sliding-window-test"
when
$msgA: LogEntry($sip: sourceIP)
Number(intValue > 2) from accumulate (
$msgB: LogEntry(sourceIP == $sip, this after $msgA) over window:time(10s); count($msgB))
then
System.out.println("rule sliding-window-test action actived!!");
retract($msgA)
end
这是我的代码:
public class LogEntry {
private String logcontent = null;
private String[] logFieldStrArray = null;
private String sourceIP = null;
private long callDateTime;
public LogEntry(String content) {
this.logcontent = content;
if (logFieldStrArray == null) {
logFieldStrArray = logcontent.split("\\,");
}
sourceIP = logFieldStrArray[6];
**callDateTime = System.nanoTime();**
}
public long getcallDateTime() {
return callDateTime;
}
public String getsourceIP() {
return sourceIP;
}
}
会话配置正确,这里只展示如何调用clock advanceTime。 使用Pseudo Clock,advanceTime。
public class DroolsSession {
private long beginTime = 0, curTime = 0;
private statfulKsession;
private Object syncobject;
public void InsertAndFireAll(Object obj) {
synchronized(syncobject) {
if (beginTime == 0) {
beginTime = ((LogEntry)obj).getcallDateTime();
} else {
curTime = ((LogEntry)obj).getcallDateTime();
long l = advanceTime(curTime - beginTime, TimeUnit.NANOSECONDS);
beginTime = curTime;
}
statfulKsession.insert(obj);
statfulKsession.fireAllRules();
}
}
}
顺便说一句,我使用System.nanoTime()
,Drools
支持nanoTime
吗?
我期待着你的回答。很高兴。
答案 0 :(得分:0)
规则“滑动窗口测试”的条件是: 如果有一个LogEntry事件A(无论多大,无论多大)和 如果有两个以上的LogEntry事件多于A并且使用相同的sourceIP在过去的10秒内到达:然后撤回A.
这不允许自动收回LogEntry事件,因为它是 总是有可能在以后的某个时间满足第二个条件。