1

对于满足规则的事件,如何在监听器中获取相关的滑动窗口(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 相关的滑动窗口的信息。

4

2 回答 2

0

您应该为事件 A 、 B 和 C 提供 3 个单独的语句

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

例如,我有针对证券的股票事件 - SAPE、PNG 和 GOOG。我将编写 3 个单独的查询,例如

@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

于 2013-06-08T06:19:53.390 回答
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");
 }
于 2013-06-07T01:44:16.667 回答