创建Esper的epl实例

时间:2018-01-19 08:34:34

标签: java complex-event-processing esper stocks epl

我正在玩Esper,学习如何使用更高级的概念。 我有一个程序可以触发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 个答案:

答案 0 :(得分: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....

Doc章节链接以获得更完整的解决方案...... http://esper.espertech.com/release-7.0.0/esper-reference/html_single/index.html#perf-tips-27