首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Drools引擎:用于高流量应用程序的内存管理

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

Stack Overflow用户
提问于 2017-05-16 16:21:54
回答 1查看 691关注 0票数 0

此代码的目的是监视不同类别的事件流,并根据相应类别的事件频率,在不同类别中提出不同级别的警报。每个类别的警报级别都在逐步增加,每个类别的每个级别只插入一个警报对象。如果告警已经足够老且不能满足任何规则,则它们必须过期。每个类别的每个级别警报到期的时间是不同的。另外,事件必须在不同的时间过期才能达到最佳的内存使用。

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

问:如何正确管理内存并丢弃不必要的Alarm/Event对象?使用Drools推断的过期是首选的;我是否可以以任何方式更改代码以使其工作?(比如在现有规则中添加时间限制?)向Event/Alarm类型添加过期标记是最后的手段。

提前感谢

代码语言:javascript
复制
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

编辑:该项目的要求是监测事件和火灾警报的频率(如有必要)(详见上文)。这些告警也可以参与触发一组规则,每个规则都有自己的时间限制。

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

代码语言:javascript
复制
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

下面的代码中有类似的流口水吗?

代码语言:javascript
复制
$eventA : Event( this before[ 0s, 4m ] time.now )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-21 09:48:59

没有由Drools自动提供的Now事实。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44006741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档