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

时间:2017-05-16 16:21:54

标签: drools drools-fusion

此代码的目的是监视不同类别的事件流,并根据相应类别的事件频率,在不同类别中引发不同级别的警报。 每个类别的警报级别逐渐增加,每个类别每个级别只插入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

编辑: 该项目的要求是监控事件的频率,并在必要时触发警报(详见上文)。那些警报也可以参与解雇一组规则,每个规则都有自己的时间限制。

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

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 )

1 个答案:

答案 0 :(得分:0)

Drools自动提供Now事实。

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

修改 Drools的自动时间戳必须被认为是一个草率的解决方案。它绝对适用于真正的时间戳不是最重要或不可用的应用。否则,应确定事件创建位置的事件的时间戳,并成为事件的属性之一。您可以像使用任何其他属性一样访问此字段,并使用时间运算符比较其值。