如何在CEP中实现连续时间窗口?

时间:2015-07-17 11:04:27

标签: wso2 esper complex-event-processing siddhi

假设我有一系列事件,我希望能够计算出时间窗口中有多少事件。我想在事件进入时间窗口时收到通知并更改计数,当事件退出时间窗口时也是如此。

下图显示了我的意思。我使用长度为4的时间窗口,我想要3个通知,一个是第一个事件进入窗口时,第二个是第二个事件进入时,第三个是第一个事件退出时间窗口时。

enter image description here

如何进行查询呢?如果我还想按活动的财产分组怎么办?

这是我到目前为止所做的事情,但是当事件离开窗口时它并没有给我通知:@config(async = 'true') define stream myStream (symbol string, timeStamp long) @info(name = 'query1') from myStream#window.externalTime(timeStamp,10 sec) select symbol, timeStamp, count(timeStamp) as eventCount group by symbol insert into outputStream。这是为了SIddhi CEP,但我想Esper会是相似的。

1 个答案:

答案 0 :(得分:2)

从WSO2 CEP中的任何类型的窗口,您可以预期两种类型的事件。

  1. 当前事件 - 当新事件进入窗口时会触发这些事件。即新事件本身用作触发器
  2. 过期事件 - 当窗口中的现有事件退出时触发这些事件。即在时间窗口为1分钟的情况下,每个事件保持1分钟并在1分钟结束时发出
  3. 您也可以在同一查询中使用这两者的组合,从两种类型的事件中触发它。

    在CEP 3.1.0中使用两种类型的触发器的示例查询将是(检查docs here):

    from StockExchangeStream[symbol == 'WSO2']#window.time( 1 minute ) 
    select max(price) as maxPrice, avg(price) as avgPrice, min(price) as minPrice
    insert into WSO2StockQuote for all-events  
    

    如果您希望仅使用过期事件触发此操作,请使用'expired-events'代替'all-events'。同样适用于当前事件。如果您没有指定任何内容,则默认为current-events,这就是为什么您的当前查询不会被过期事件触发的原因。

    请注意,对于CEP 4.0.0,语法略有不同,正确的语法检查test source codes here(因为文档仍在进行中)。