Drools @timestamp和";之间的关系是什么;窗口上方:时间“;?

Drools @timestamp和";之间的关系是什么;窗口上方:时间“;?,drools,drools-fusion,Drools,Drools Fusion,我正在使用Drools 6.2.0.Final,我需要使用window:time处理一组事件。每个事件都有一个日期字段 public class Event { private Long id; private Date date; ... 在我的drl中: declare org.drools.examples.broker.events.Event @role( event ) @timestamp (date) end rule

我正在使用Drools 6.2.0.Final,我需要使用window:time处理一组事件。每个事件都有一个日期字段

public class Event {

    private Long id;

    private Date date;
        ...
在我的drl中:

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 
  • e1(2015-01-01 00:00:00)
  • e2(2015-01-01 00:00:20)
  • e3(2015-01-01 00:00:40)
  • e4(2015-01-01 00:01:00)
场景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:使用pseudo,同时插入一组事件,并将事件的偏移量添加到时钟中

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();
第二种情况运行良好。但我有一些问题:

  • @timestamp和“over window:time”之间的关系是什么
  • 如果需要在工作内存中插入未排序的事件(按时间戳),会发生什么
  • 我可以使用事件表示的时间戳而不是插入时间表示的时间戳吗
谢谢

更新1


@时间戳、@duration等仅用于将事件关联在一起(例如,A在B之前,A遇到B,等等),并且它们不将事件关联到时钟。但“窗口外:时间”是基于Drools的时钟。窗口的时间使用事件插入工作内存的时刻来匹配规则。您需要使用Drools流模式。

@timestamp和“over window:time”之间的关系是什么?长度为d的窗口选择一个包含时间戳x的事件(如果
now.d