Создание экземпляров эспера epl

Я играю с Эспером, учусь использовать более продвинутые концепции. У меня есть программа, которая запускает фиктивные события акций 3 разных акций. В настоящее время у меня есть модуль с шаблоном EPL match_recognize, который выглядит так:

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. События начинают выполняться, и я решаю, что хочу отслеживать разницу более чем в X сумм между MIC/GOO. Затем я решаю, что хочу отслеживать 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
);

person jocund    schedule 19.01.2018    source источник


Ответы (1)


Вы можете заставить Esper выделить несколько разделов оператора, используя контексты. Поместите переменные в событие "Init" и отправьте это событие для выделения каждой из них. Пример

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#perf-tips-27

person user650839    schedule 19.01.2018
comment
Извините, что беспокою вас снова, но, хотя он успешно развертывается, я не могу заставить ни одного слушателя или подписчика работать с ним. Есть ли какой-то особый способ работы с разделами контекста и подписчиками, о котором я не знаю? - person jocund; 24.01.2018