Создание экземпляров эплера Эспера
Я играю с Эспером, учусь использовать более продвинутые концепции. У меня есть программа, которая запускает фиктивные акции из 3 разных акций. В настоящее время у меня есть модуль с шаблоном match_recognize EPL, который выглядит следующим образом:
module queries;
import events.*;
import configDemo.*;
import annotations.*;
create schema MyTickEvent as TickEvent;
@Name('compareStocks')
@Description('Compare the difference amount between two stocks')
@Subscriber(className='configDemo.MySubscriber')
select * from TickEvent
match_recognize (
measures A.currentPrice as a_currentPrice, B.currentPrice as b_currentPrice,
A.stockName as a_stockName, B.stockName as b_stockName
pattern (A C* B)
define
A as A.stockName = firstStock,
B as A.currentPrice - B.currentPrice >= difference and B.stockName =
secondStock
);
Как видите, в нем три переменные - firstStock, secondStock, разность. Я беру пользовательский ввод и затем устанавливаю переменные в коде Java следующим образом:
System.out.println("Please enter 3 char stock name for the first stock: ");
System.out.println("Available stocks: IBM, YAH, MIC");
first = scanner.nextLine();
engineHelper.getAdmin().getConfiguration().addVariable("firstStock", String.class, first);
System.out.println("Please enter 3 char stock name for the second stock: ");
second = scanner.nextLine();
engineHelper.getAdmin().getConfiguration().addVariable("secondStock", String.class, second);
System.out.println("Please enter integer value for stock difference: ");
difference = scanner.nextInt();
engineHelper.getAdmin().getConfiguration().addVariable("difference", Integer.class, difference);
Это прекрасно работает, если я хочу отслеживать только одну фондовую пару за раз. Я изо всех сил пытаюсь найти способ сделать это для нескольких пар. Я хочу иметь возможность динамически создавать / удалять / запускать / останавливать пары. Для примера, скажем, у меня есть акции YAH, APP, MIC, GOO. События начинаются, и я решаю, что я хочу отслеживать разницу между MIC/GOO и превышающей X раз. Затем я решаю, что хочу отслеживать APP/GOO на другую сумму. Данные будут примерно такими:
[IBM, YAH, 5] [GOO, APP, 3]....
Любые предложения о том, как это сделать? Я предполагаю, что мне нужно будет создать новый экземпляр EPL с новым набором переменных. Я легко могу сделать это в Java-коде, но я хочу как можно больше держаться от него подальше. Я хочу использовать файлы модулей. Поскольку это, по сути, один и тот же EPL, имеет смысл использовать его в качестве шаблона с несколькими "экземплярами" для разных пар акций.
В качестве альтернативы, есть ли другие способы добиться этого эффективно?
Я получил это работает, я заметил, что ошибки происходят из текста, которого больше нет в файле, поэтому я удалил его, переписал и все заработало. Все успешно развернуто и выглядит так:
module context;
import events.*;
import configDemo.*;
import annotations.*;
import main.*;
import subscribers.*;
create schema InitEvent(firstStock string, secondStock string, bias double);
create context TwoStocksContext
initiated by InitEvent as initEvent;
@Name('compareStocks')
@Description('Compare the difference between two different stocks and make a
decision')
@Subscriber(className='subscribers.MySubscriber')
context TwoStocksContext
select * from TickEvent
match_recognize (
measures A.currentPrice as a_currentPrice, B.currentPrice as b_currentPrice, A.stockCode as a_stockCode, B.stockCode as b_stockCode
pattern (A C* B)
define
A as A.stockCode = context.initEvent.firstStock,
B as A.currentPrice - B.currentPrice >= context.initEvent.bias and
B.stockCode = context.initEvent.secondStock
);
1 ответ
Вы можете заставить Esper выделять несколько разделов оператора, используя контексты. Поместите переменные в "Init"-Event и отправьте это событие для выделения каждой. Пример
create schema InitEvent(firststock string, secondstock string, diff double);
create context AnalyzePerFirstAndSecond initiated by InitEvent as initEvent; // add terminated here if needed
context AnalyzePerFirstAndSecond select .... define A as A.stock = context.initEvent.firststock....
Ссылка на главу документа для более полного решения... http://esper.espertech.com/release-7.0.0/esper-reference/html_single/index.html