Esper滑动事件的窗口细节

时间:2013-06-06 12:50:49

标签: esper

对于满足规则的事件,如何在侦听器中获取相关的滑动窗口(ID /名称)详细信息。

例如,我们有规则 -

select * from StockTick.win:time(10) having avg(price) > 20

我们收到StockTick事件A,B(作为滑动窗口1的一部分)。

事件B,C作为滑动窗口2的一部分(作为滑动窗口2的一部分)。

事件A是滑动窗口1的一部分,事件B是窗口1和2的一部分,事件C是滑动窗口2的一部分。

现在,对于每个事件A,B和C(B在侦听器中接收两次),如何在侦听器中找到与事件bean A,B和C相关联的滑动窗口(1或2)。

我使用了UpdateListener和StatementAwareUpdateListener。我无法获得有关与事件bean相关的滑动窗口的信息。

2 个答案:

答案 0 :(得分:0)

我不确定我完全明白你在问什么,但如果你只有2个不同的查询,那么

窗口1)

select * from StockTick.win:time(10) having avg(price) > 20

和窗口2)

select * from StockTick.win:time(10) having avg(price) > 40

然后我做的是使用2个不同的事件处理程序来区分每个事件来自哪个窗口:

EPServiceProvider epService = EPServiceProviderManager.GetDefaultProvider();
EPAdministrator admin = epService.EPAdministrator;

EPStatement avg20 = admin.CreateEPL("select * from StockTick.win:time(10) having avg(price) > 20");
EPStatement avg40 = admin.CreateEPL("select * from StockTick.win:time(10) having avg(price) > 40");
avg20.Events += HandleAvg20Event;

  // Example event handler code
  public void HandleAvg20Event(Object sender, UpdateEventArgs e) {
      Console.WriteLine("event came from avg20 stream");
  }

avg40.Events += HandleAvg40Event;

// Example event handler code
public void HandleAvg40Event(Object sender, UpdateEventArgs e) {
    Console.WriteLine("event came from avg40 stream");
 }

答案 1 :(得分:0)

对于活动A,B和B,您应该有3个单独的陈述。 C

并将单独的听众附加到他们身上。

例如,我有来自证券的股票事件--SAPE,PNG和GOOG。我会写三个单独的查询,如

@Name('Select SAPE > 20')
select * from StockTick.win:time(10) having avg(price) > 20 and symbol = 'SAPE'

@Name('Select PNG > 25')
select * from StockTick.win:time(10) having avg(price) > 25 and symbol = 'PNG'

@Name('Select GOOG> 19')
select * from StockTick.win:time(10) having avg(price) > 19 and symbol = 'GOOG'

在代码中,我将得到如下语句

EPStatement PNGSignal  = epService.getEPAdministrator().getStatement(
                "Select PNG > 25");


EPStatement SAPESignal  = epService.getEPAdministrator().getStatement(
                "Select SAPE > 20");

EPStatement GOOGSignal  = epService.getEPAdministrator().getStatement(
                "Select GOOG > 19");

然后,对于每个语句,我将附加一个更新侦听器到每个语句

PNGSignal.addListener( new updateListener {@Override
        public void update(EventBean[] arg0, EventBean[] arg1) {
                          //Sysout - inside PNG Signal 

            }
                     });

GOOGSignal.addListener( new updateListener {@Override
        public void update(EventBean[] arg0, EventBean[] arg1) {
                          //Sysout - inside GOOG Signal 

            }
                     });

有关更多信息,请参阅我的CEP / ESPER视频 http://www.youtube.com/watch?feature=player_embedded&v=emwwpvfaddw