我正在使用Drools 6.2.0.Final,我需要使用window:time来处理一组事件。每个事件都有一个日期字段。
public class Event {
private Long id;
private Date date;
...
在我的书中:
declare org.drools.examples.broker.events.Event
@role( event )
@timestamp (date)
end
rule "test"
when
$count: Number() from accumulate (
$e: Event() over window:time(40s) from entry-point "stream" ,
count($e))
then
System.out.println("Count:" + $count);
end
场景1:使用实时并同时插入一个事件。
session.getEntryPoint("stream").insert(e1);
session.fireAllRules();
session.getEntryPoint("stream").insert(e2);
session.fireAllRules();
session.getEntryPoint("stream").insert(e3);
session.fireAllRules();
session.getEntryPoint("stream").insert(e4);
session.fireAllRules();
场景2:使用伪,同时插入一个事件并添加事件的偏移时钟。
session.getEntryPoint("stream").insert(e1);
session.fireAllRules();
clock.advanceTime(20, TimeUnit.SECONDS);
session.getEntryPoint("stream").insert(e2);
session.fireAllRules();
clock.advanceTime(40, TimeUnit.SECONDS);
session.getEntryPoint("stream").insert(e3);
session.fireAllRules();
clock.advanceTime(60, TimeUnit.SECONDS);
session.getEntryPoint("stream").insert(e4);
session.fireAllRules();
第二种情况运行良好。但我有一些问题:
感谢。
更新1
@timestamp,@ duration等仅用于将事件关联在一起(例如,A在B之前,A在B之间,等等),并且它们不将事件与时钟相关联。但是“窗外:时间”是基于Drools的时钟。窗口的时间使用事件插入工作内存以匹配规则的时刻。您需要使用Drools流模式。
答案 0 :(得分:1)
@timestamp与&#34;在窗口之间有什么关系:时间&#34;?长度为d的窗口选择包含时间戳x的事件now.d < x <= now
。< / p>
如果我需要在工作记忆中插入未分类的事件(按时间戳),会发生什么?除非引擎位于&#34; cloud&#34;否则你不应该这样做。模式。时间戳基本上只是一个长值,并且可以进行全部相同的评估。但是,在执行此操作之前,您应该仔细考虑,因为这可能会产生与以正确顺序完成插入的执行不同的结果。
我可以使用由我的事件表示的时间戳而不是插入时间所表示的时间戳吗?由于@timestamp(date)
,您似乎正在这样做DRL声明声明。