public class OrderEvent { private String itemName; private double price; public OrderEvent(String itemName, double price) { this.itemName = itemName; this.price = price; } public String getItemName() { return itemName; } public double getPrice() { return price; } }
select * from OrderEvent
win:time(3 sec)就是定义了3秒的时间窗口, avg(price)就是统计了3秒内的OrderEvent对象的price的平均值select avg(price) from test.OrderEvent.win:time(3 sec)
win:length(10)就是定义了10个Event的, avg(price)就是统计了最近10个的OrderEvent对象的price的平均值select avg(price) from test.OrderEvent.win:length(100)
public class MyListener implements UpdateListener { public void update(EventBean[] newEvents, EventBean[] oldEvents) { EventBean event = newEvents[0]; System.out.println("avg=" + event.get("avg(price)")); } }
贴得比较乱 简单解释一下, ScheduledThreadPoolExecutor .scheduleAtFixedRate固定每100ms(可配置)运行一次,并且通过计算延迟 future.getDelay来确保计时精确,接下来通过发送一个 CurrentTimeEvent来推送时间前进100+delay(ms),也就是说ESPER中的时间不是完全受机器时间控制的,而是通过发送TimeEvent由应用来进行控制的,这方便做很多的扩展。ScheduledThreadPoolExecutor timer;//省略构造
timerTask = new EPLTimerTask(timerCallback);
ScheduledFuture<?> future = timer.scheduleAtFixedRate(timerTask, 0, msecTimerResolution, TimeUnit.MILLISECONDS);//估计每100毫秒运行一次
...
_lastDrift = Math.abs(future.getDelay(TimeUnit.MILLISECONDS));//计算延迟
...
CurrentTimeEvent currentTimeEvent = new CurrentTimeEvent(msec); sendEvent(currentTimeEvent);//发送时间控制Event
批量长度窗口模式select avg(price) from test.OrderEvent.win:time_batch(3 sec)
时间批量模式的操作图如下select avg(price) from test.OrderEvent.win:length_batch(10)
having过滤select avg(price) from test.OrderEvent.win:time_batch(3 sec) where price>10
似曾相识啊,执行方式也基本和SQL里的where 和 having差不多。select avg(price) from test.OrderEvent.win:time_batch(3 sec) having price>10
select count(price) from test.OrderEvent.win:time_batch(3 sec) where price>10
group byselect sum(price) from test.OrderEvent.win:time_batch(3 sec) where price>10
select itemName,sum(price) from test.OrderEvent.win:time_batch(3 sec) where price>10 group by itemName
select Math.round(sum(price)) from test.OrderEvent.win:time_batch(3 sec) where price>10
配置一下public class Util { public static double computePercent(double amount, double total) { return amount / total * 100; } }
OK了,可以用了<plugin-singlerow-function name="percent" function-class="mycompany.MyUtilityClass" function-method="computePercent" />
select percent(price,total) from OrderEvent