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)
其運作原理如圖: