/** * Chapter 3. Processing Model * 3.7. Aggregation and Grouping * 订阅者实现监听 * * @see http://www.espertech.com/esper/release-5.2.0/esper-reference/html_single/index.html#processingmodel_aggregation * http://www.espertech.com/esper/release-5.2.0/esper-reference/html_single/index.html#config-variables * http://www.espertech.com/esper/release-5.2.0/esper-reference/html_single/index.html#variable_using * http://www.espertech.com/esper/release-5.2.0/esper-reference/html_single/index.html#config-engine-variables * * @param eventBean * @return * @throws InterruptedException */ @Test public void test_() throws InterruptedException { HttpLog httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); TimeUnit.SECONDS.sleep(10); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); httpLog = new HttpLog(1, UUID.randomUUID().toString(), "www.baidu.com/tieba", "www.baidu.com", "userAgent", LocalDateTime.now()); esperTemplateBean.sendEvent(httpLog); }
在Esper的配置文件中我们定义了一个变量,其配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <esper-configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.espertech.com/schema/esper" xsi:schemaLocation=" http://www.espertech.com/schema/esper http://www.espertech.com/schema/esper/esper-configuration-2.0.xsd"> <!-- <event-type name="StockTick" class="com.espertech.esper.example.stockticker.event.StockTick" /> --> <!-- <event-type name="PriceLimit" class="com.espertech.esper.example.stockticker.event.PriceLimit" /> --> <event-type-auto-name package-name="com.doctor.esper.event" /> <variable name="var_threshold" type="int" initialization-value="6" constant="true" /> <engine-settings> <defaults> <stream-selection> <stream-selector value='ISTREAM' /> </stream-selection> <execution fairlock="true" /> </defaults> </engine-settings> s</esper-configuration>
esper-spring配置文件:
<bean id="thresholdHttpLogStatement" class="com.doctor.esper.spring.EsperStatement" p:subscriber-ref="httpLogSubscriber" p:subscriberMethodName="update" c:epl=" select log.*,count(*) from HttpLog.win:time(10 sec) as log group by id having count(*) >= var_threshold " />
输出内容:
06-20 18:03:11.027 main WARN c.d.e.s.HttpLogSubscriber - 报警阈值httplog{"id":1,"machineId":"2891816a-9272-4c11-b510-8481ea829778","referer":"www.baidu.com","requestPath":"www.baidu.com/tieba","time":"2015-06-20T18:03:11.026","userAgent":"userAgent"}超过访问次数6
06-20 18:03:21.132 main WARN c.d.e.s.HttpLogSubscriber - 报警阈值httplog{"id":1,"machineId":"830bf9ab-b625-4a38-9e61-3367aa1aa661","referer":"www.baidu.com","requestPath":"www.baidu.com/tieba","time":"2015-06-20T18:03:21.132","userAgent":"userAgent"}超过访问次数6
06-20 18:03:21.133 main WARN c.d.e.s.HttpLogSubscriber - 报警阈值httplog{"id":1,"machineId":"571c8281-7a1e-48bd-a10b-200b073468fe","referer":"www.baidu.com","requestPath":"www.baidu.com/tieba","time":"2015-06-20T18:03:21.133","userAgent":"userAgent"}超过访问次数7
分析:一开始发送6个HttpLog同样的事件,触发了订阅者,输出一条报警信息,然后休眠10秒。时间窗口内的事件过期了。然后我们继续发送7个同样的事件,最后两个肯定都会报警的(10秒内没老事件过期的)。
注:用了https://github.com/opencredo/opencredo-esper/tree/master/esper-template 中的esper-spring结合代码(并小做了部分调整,没用它的XML配置方式)。
在此,分享下与Esper相关的网站:
esper学习