Drools Fusion CEP中的测试事件过期

Drools Fusion CEP中的测试事件过期,drools,complex-event-processing,drools-fusion,Drools,Complex Event Processing,Drools Fusion,Ciao,我已经用几种方法进行了测试,但我仍然无法测试和验证Drools Fusion中的事件过期机制,所以我正在寻找一些小指导,好吗 我已经阅读了手册,并且对该功能感兴趣: 换句话说,当一个事件被插入到工作内存中时,引擎可以发现事件何时不再与其他事实匹配,并自动收回它,释放其相关资源 我在Eclipse 5.4.0.Final中使用Drools IDE,并修改了“New Drools Project”向导创建的模板代码,以测试和验证事件是否过期 下面是代码。我理解使“生命周期”正常工作的方法是

Ciao,我已经用几种方法进行了测试,但我仍然无法测试和验证Drools Fusion中的事件过期机制,所以我正在寻找一些小指导,好吗

我已经阅读了手册,并且对该功能感兴趣:

换句话说,当一个事件被插入到工作内存中时,引擎可以发现事件何时不再与其他事实匹配,并自动收回它,释放其相关资源

我在Eclipse 5.4.0.Final中使用Drools IDE,并修改了“New Drools Project”向导创建的模板代码,以测试和验证事件是否过期

下面是代码。我理解使“生命周期”正常工作的方法是:

  • 必须在流模式下设置KBase-检查
  • 必须按时间顺序插入事件-检查
  • 您必须定义事件之间的时间约束-在我的案例中检查是最后一条消息()
但是,当我最后检查EventFactHandle时,没有一个事件()已过期。 谢谢你的帮助

爪哇:

流口水:

package com.sample

import com.sample.DroolsTest.Message;

declare Message
@role(event)
end

declare window LastMessageWindow
    Message() over window:length(1)
end

rule "Hello World"
    when
       accumulate( $m : Message(status==Message.HELLO) from window LastMessageWindow,
                $messages : collectList( $m ) )
    then
        System.out.println( ((Message)$messages.get(0)).getMessage() );
end
请注意:即使我在消息事件中添加了1秒的过期时间

@expires(1s)

我仍然没有得到预期的结果,即插入的第一个消息事件,我预期的现在已过期?感谢您的帮助。

找到了解决方案!显然是我太笨了,没有意识到我在使用Drools 5.4.0.Final,同时仍然在引用5.2.0.Final的旧文档。在Drools Fusion 5.4.0.Final的更新文档中,为2.6.2添加了此框。滑动长度窗口

请注意,基于长度的窗口不定义会话的事件过期的时间约束,并且引擎不会考虑它们。如果事件没有定义时间约束的其他规则,也没有明确的过期策略,引擎将无限期地将它们保留在会话中

因此,我最初提出的第三个要求“您必须定义事件之间的时间约束”显然没有得到满足,因为我现在了解Drools 5.4.0.Final中的滑动长度窗口:

Message() over window:length(1)
确实不是会话中事件过期的时间约束的定义

更新这个答案,希望有人会发现它有帮助。另外,你也知道,我很愚蠢,因为我依赖谷歌搜索来获取文档,有时你不会被重定向到当前的发布文档,所以看起来

Message() over window:length(1)