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

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

Другие вопросы по тегам