使用滑动窗口时无法自动删除事实

时间:2015-06-27 15:01:15

标签: java drools

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吗?

我期待着你的回答。很高兴。

1 个答案:

答案 0 :(得分:0)

规则“滑动窗口测试”的条件是: 如果有一个LogEntry事件A(无论多大,无论多大)和 如果有两个以上的LogEntry事件多于A并且使用相同的sourceIP在过去的10秒内到达:然后撤回A.

这不允许自动收回LogEntry事件,因为它是 总是有可能在以后的某个时间满足第二个条件。