程序员的量化交易之路(6)-Esper之处理模型(5)

来源:互联网 发布:win7安装mac os系统 编辑:程序博客网 时间:2024/04/28 09:51

3 处理模型(Processing Model)

Esper的处理模型是持续的:更新监听器listener和订阅者subscriber,当事件到来时,根据声明对事件流、视图、过滤和输出等。

 

监听器的接口是com.espertech.esper.client.UpdateListener,必须实现update方法,这个函数会在结果到来时触发。

 

3.2 插入流(Insert Stream)

我们来看一个非常简单的EPL语句:

 

Select * from Withdrawal

 

这条语句没有附加任何过滤、视图等条件。这条语句会当Withdrawal或者其子类对象到来时触发。

下面是是一个例子。


图3.1 Output example for a simple statement

 

上面这个简单的例子中只有new events被提交到语句的监听器中,oldevents没有。

 

3.3 插入和删除流

一个长度窗口是让引擎只保留最近的N个事件。下面的语句给Withdrawal事件流一个长度窗口。这条语句用于说明数据窗口,一个事件有进就有出的数据窗口。

 

select * from Withdrawal.win:length(5)

 

下面这幅图就是数据窗口的一个例子:


它保有5个时间,所以当窗口满了后,最先的w1事件就会被删除,做old events送给监听器。

和长度窗口类似的还有事件窗口。

 

3.4 过滤和where语句

过滤器会过滤掉那些不符合条件的事件,这些事件就不会被投递到语句的监听器中。例如:

 

select * fromWithdrawal(amount>=200).win:length(5)

 

任何amount值小于200的Withdrawal对象都不会被投到监听器的回调函数里面。下图是说明。


上述图可以看到,事件还没有进入到窗口就被过滤了。

Where和having语句则不一样,它是在事件进入到窗口之后再过滤。

 

select * from Withdrawal.win:length(5)where amount >= 200

 

3.5 时间窗口(Time Window)

这一节我们说明时间窗口以及时间批处理窗口

3.5.1 时间窗口

时间窗口就是保留特定事件间隔内的事件。

下面是一个示例:

 

select account, avg(amount)

from Withdrawal.win:time(4 sec)

group by account

having amount > 1000

 

下面是一个更为简单的例子:

 

select * from Withdrawal.win:time(4 sec)

 

下面图示是解释其原理:


 

3.5.2 Time Batch 事件批处理

就是每隔设定的时间才会去触发一次监听器。

 

例如如下语句:

 

select * from Withdrawal.win:time_batch(4sec)

 

其运行原理如图:


 

 

0 0
原创粉丝点击