Drools引擎:高流量应用程序的内存管理

Drools引擎:高流量应用程序的内存管理,drools,drools-fusion,Drools,Drools Fusion,该代码的目的是监控不同类别的事件流,并根据相应类别的事件频率,在不同类别中发出不同级别的警报。 每个类别的报警级别逐渐增加,每个类别的每个级别只插入1个报警对象报警如果已经足够大且不再满足任何规则,则必须过期。对于每个类别,每个级别的警报过期的时间是不同的。另外,事件必须在不同的时间过期,以实现最佳内存使用 当将报警和事件对象声明为事件时,自动事件生命周期管理根本不起作用。如果我将报警声明为事实,则类型为事件的对象将按预期被丢弃,但毫不奇怪,报警类型的对象将永远保留在内存中 问题:如何正确管理内

该代码的目的是监控不同类别的事件流,并根据相应类别的事件频率,在不同类别中发出不同级别的警报。 每个类别的报警级别逐渐增加,每个类别的每个级别只插入1个报警对象报警如果已经足够大且不再满足任何规则,则必须过期。对于每个类别,每个级别的警报过期的时间是不同的。另外,事件必须在不同的时间过期,以实现最佳内存使用

当将报警事件对象声明为事件时,自动事件生命周期管理根本不起作用。如果我将报警声明为事实,则类型为事件的对象将按预期被丢弃,但毫不奇怪,报警类型的对象将永远保留在内存中

问题:如何正确管理内存并丢弃不必要的报警/事件对象?首选利用Drools推断的到期时间;我是否可以通过任何方式更改代码以使其正常工作?(例如,可能会向现有规则添加时间限制?)向事件添加expires标记是最后的选择

提前谢谢

declare Event
    @role(event)
end

declare Alarm
    @role(event)
end

rule "Alarm Level 1"
    when
        $e : Event()
        not (Alarm(category == $e.getCategory(), level == 1)
    then
        Alarm a = new Alarm($e.getCategory());
        a.setLevel(1);
        insert(a);
end


rule "Alarm Level 2"
    when
        $alarm : Alarm(level == 1)
        not (Alarm(category == $alarm.getCategory(), level == 2)
        Number( intValue >= 5 ) from accumulate(
            $e : Event(category == $alarm.getCategory()) over window:time( 1h ),
            count($e) )
    then
        Alarm a = new Alarm($alarm.getCategory());
        a.setLevel(2);
        insert(a);
end

rule "Alarm Level 3"
    when
        $alarm : Alarm(level == 2)
        not (Alarm(category == $alarm.getCategory(), level == 3)
        Number( intValue >= 15 ) from accumulate(
            $e : Event(category == $alarm.getCategory()) over window:time( 2h ),
            count($e) )
    then
        Alarm a = new Alarm($alarm.getCategory());
        a.setLevel(3);
        insert(a);
end
编辑: 本项目的要求是监测事件s和火灾警报s的频率(如有必要)(详见上文)。这些
警报还可以参与触发一组规则,每个规则都有自己的时间限制

换句话说,我需要写一条这样的规则:

rule "A"
    when
        $a Alarm($param : some_param, some_constraints, happened_in_last_n_secs)
        $e Event(some_param == $param, some_constraints, happened_in_last_m_secs)
    then
        do_stuff
end
Drools中是否有类似下面的代码

$eventA : Event( this before[ 0s, 4m ] time.now )

Drools现在没有自动提供的
事实

考虑创建此事件,并在触发由具有适当间隔的计时器驱动的规则时更新其时间戳

编辑
Drools的自动时间戳必须被视为一个草率的解决方案。它非常适合于实时时间戳不重要或不可用的应用程序。否则,事件的时间戳应确定在何处创建,并成为事件的属性之一。您可以像访问任何其他属性一样访问此字段,并使用时态运算符比较其值。

我想您还没有在问题中写下所有要求。但我确信,考虑到所有需求,编写规则来处理从工作内存中收回事件和报警事实是可能的。应该不需要明确的
@expires
。我编辑了这个问题。希望它能澄清我的观点。在流模式下运行发动机时,这可能吗?如何访问时间戳字段?因此,如果我理解正确,我应该:1:插入一个事实并为其编写相应的规则以更新其时间戳。2:使用之前的
将我的事件时间与此事实进行比较考虑到Drools具有时间窗口功能,是否有一种简单的方法可以获取LHS中最近n秒内发生的最新报警的参考?使用时间戳作为事实属性。-当然,“事实”现在需要更新-时间总是在移动。是的,你可以使用时间窗口在一定的时间间隔内定位事件。你的Q听起来好像不是你的问题。从语法上讲,我如何从规则LHS中的时间窗口检索最新的
事件(一些约束)