Шаблон Esper EPL срабатывает только один раз - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь создать шаблон в EPL, но я не понимаю, почему он соответствует только одному. Вот что я сделал на веб-странице Esper EPL онлайн . EPL I вводится в левом текстовом поле:

create schema StockTick(signature string, source string, destination string, action string);
@Name('Monitor') select * from StockTick;
@Name('Out') select * from pattern [A=StockTick -> B=StockTick(B.source = A.source and B.destination = A.destination and B.action='block') where timer:within(2 seconds)];

, а события, которые вводятся в среднем текстовом поле:

StockTick={signature='sig1', source ='s1', destination ='d1'}
t=t.plus(0.4 seconds)

StockTick={source ='s1', destination ='d1', action='block'}
t=t.plus(0.4 seconds)

StockTick={signature='sig2', source ='s2', destination ='d2'}
t=t.plus(0.4 seconds)

StockTick={source ='s2', destination ='d2', action='block'}
t=t.plus(0.4 seconds)

Вывод, который я получаю в правом окне:

At: 2001-01-01 08:00:00.000
Statement: Monitor
Insert
StockTick={signature='sig1', source='s1', destination='d1', action=(null)}

At: 2001-01-01 08:00:00.400
Statement: Monitor
Insert
StockTick={signature=(null), source='s1', destination='d1', action='block'}
Statement: Out
Insert
stmt2_pat_0_1={A={StockTick={signature='sig1', source='s1', destination='d1', action=(null)}}, B={StockTick={signature=(null), source='s1', destination='d1', action='block'}}}

At: 2001-01-01 08:00:00.800
Statement: Monitor
Insert
StockTick={signature='sig2', source='s2', destination='d2', action=(null)}
At: 2001-01-01 08:00:01.200
Statement: Monitor
Insert
StockTick={signature=(null), source='s2', destination='d2', action='block'}

Итак:

  • через 0 секунд оператор Monitor срабатывает (отлично!)
  • через 0,4 секунды, оператор Monitor запускается снова (отлично! )
  • через 0,4 секунды, оператор Out срабатывает (отлично!)
  • через 0,8 секунды, оператор Monitor запускается снова (отлично!)
  • через 1,2 секунды, оператор Monitor снова запускается (отлично!)

Чего я не понимаю, так это того, почему через 1,2 секунды я не запускаю оператор Out снова, как я ожидал.

Обратите внимание, что если я попробую только первые две вставки и только две вторые вставки, в обоих случаях у меня будет дважды запущен оператор Monitor, а один раз - оператор Out. Проблема возникает, когда я объединяю четыре оператора вставки.

1 Ответ

0 голосов
/ 30 января 2020

Благодаря другому форуму мне удалось решить проблему. Я пропустил ключевое слово every при определении шаблона, поэтому после обновления правила следующим образом:

@Name('Out') select * from pattern [every A=StockTick -> B=StockTick(B.source = A.source and B.destination = A.destination and B.action='block')];

это сработало как шарм:

At: 2001-01-01 08:00:00.000
Statement: Monitor
Insert
StockTick={signature='sig1', source='s1', destination='d1', action=(null)}

At: 2001-01-01 08:00:00.400
Statement: Monitor
Insert
StockTick={signature=(null), source='s1', destination='d1', action='block'}
Statement: Out
Insert
stmt2_pat_0_0={A={StockTick={signature='sig1', source='s1', destination='d1', action=(null)}}, B={StockTick={signature=(null), source='s1', destination='d1', action='block'}}}

At: 2001-01-01 08:00:00.800
Statement: Monitor
Insert
StockTick={signature='sig2', source='s2', destination='d2', action=(null)}

At: 2001-01-01 08:00:01.200
Statement: Monitor
Insert
StockTick={signature=(null), source='s2', destination='d2', action='block'}
Statement: Out
Insert
stmt2_pat_0_0={A={StockTick={signature='sig2', source='s2', destination='d2', action=(null)}}, B={StockTick={signature=(null), source='s2', destination='d2', action='block'}}}
...