2015-07-17 5 views
1

Скажите, что у меня есть поток событий, и я хочу, чтобы уметь подсчитывать, сколько из них есть во временном окне. Я хотел бы получать уведомление, когда событие входит в окно времени и изменяет счетчик и то же самое, когда событие выходит из окна времени.Как реализовать непрерывное временное окно в CEP?

На приведенной ниже иллюстрации показано, что я имею в виду. Я использую временное окно длиной 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, но я думаю, что Эспер был бы подобен.

ответ

2

Из любого типа окна в WSO2 CEP вы можете ожидать два типа событий.

  1. Текущие события - они срабатывают, когда новое событие входит в окно. то есть новое событие само по себе используется как триггер
  2. Истекшие события - они запускаются, когда существующее событие в окне выходит из него. т.е. в случае временного окна в 1 минуту каждое событие сохраняется в течение 1 минуты и испускается в конце 1 минуты

Вы также можете использовать комбинацию из этих двух в том же запросе, чтобы вызвать ее из обоих типы событий.

Пример запроса, который использует оба типа триггеров в СЕР 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 

, если вы хотите, чтобы это было вызвано только с помощью старых событий, используйте «истекли-события «вместо« всех событий ». То же самое относится к текущим событиям. Если вы ничего не укажете, по умолчанию будут отображаться текущие события, поэтому ваш текущий запрос не запускается для истекших событий.

Обратите внимание, что для CEP 4.0.0 синтаксис немного отличается, для правильной проверки синтаксиса test source codes here (так как документы все еще находятся в процессе выполнения).

+0

Это не работает. Я использую Siddhi 3.0.0-M1. Запрос: '@config (async = 'true') определяет поток myStream (символьная строка, timeStamp long) @info (name = 'query1') из myStream # window.externalTime (timeStamp, 10 sec) select symbol, timeStamp, count (timeStamp) как eventCount по символу вставить все события в outputStream' (обратите внимание на внешнее время). Но я все еще получаю события, когда событие входит в окно времени. – Johnny

+0

Это потому, что вы используете внешнее окно времени, которое использует внешнюю метку времени. поэтому окно сравнивает время существующих событий со временем появления новых входящих событий и истекает их. если не обязательно использовать внешнее время, просто используйте простое окно времени, # window.time (10 секунд) –

+0

также попробуйте использовать альфа-бета-версию или последний снимок сиддхи, так как он содержит исправления для многих ошибок в M1 , –

Смежные вопросы