SODBASE CEP允许使用各类型的自定义时钟。例如,一些应用里会用到第三方系统生成的时间戳,另外,有的系统并不是按通常意义的时钟如最小单位毫秒来计时。每个事件都有两个时间戳:开始时间和结束时间。基本事件的开始时间和结束时间相等。控制时钟,在SODBASE CEP引擎中,可以通过设置事件的时间戳属性来实现。
1.示例操作步骤
功能:5秒的时间窗口输出数据,但如果没到5秒输入数据积达到10个,也输出。应用场景为在批量入库时,如果时间设置的过大,入库不及时,设置的过小,又入库太频繁,所以同时给时间和数量两个判断条件。
(1)下载GUI建模工具SODBASE Studio 2.0.20或以上版本,解压
(2)下载EPL语句模型文件onbatch.sod,onbatchinput.sod
(3)双击cepstudio.exe打开SODBASE Studio,导入上一步下载的模型文件
(4)点击onbatch,工作面板右键测试运行,启动模型
点击onbatchinput,工作面板右键测试运行,启动模拟数据源
输出
*******ComplexEvent********
0 se name: IBM, price: 52, timestamp: 1435240395390, type: data 0
[
1 data name: Google, price: 14, timestamp: 1435240395593, type: data 1
2 data name: Google, price: 95, timestamp: 1435240395796, type: data 2
3 data name: Google, price: 72, timestamp: 1435240396000, type: data 3
4 data name: Sun, price: 5, timestamp: 1435240396203, type: data 4
5 data name: Sun, price: 4, timestamp: 1435240396406, type: data 5
6 data name: Sun, price: 15, timestamp: 1435240396593, type: data 6
7 data name: Google, price: 42, timestamp: 1435240396796, type: data 7
8 data name: Google, price: 84, timestamp: 1435240397000, type: data 8
]
9 ee name: Google, price: 8, timestamp: 1435240397203, type: data 9
*******ComplexEvent********
10 se name: Google, price: 74, timestamp: 1435240397406, type: data 10
[
11 data name: Sun, price: 19, timestamp: 1435240397593, type: data 11
12 data name: Sun, price: 21, timestamp: 1435240397796, type: data 12
13 data name: Sun, price: 1, timestamp: 1435240398000, type: data 13
14 data name: Google, price: 46, timestamp: 1435240398203, type: data 14
15 data name: Google, price: 34, timestamp: 1435240398406, type: data 15
16 data name: Sun, price: 6, timestamp: 1435240398609, type: data 16
17 data name: IBM, price: 13, timestamp: 1435240398796, type: data 17
18 data name: IBM, price: 35, timestamp: 1435240399000, type: data 18
]
19 ee name: Google, price: 20, timestamp: 1435240399203, type: data 19
......
2.工作原理
2.1 时间戳设置修改方法
Java API中,Event类和它的子类PrimitiveEvent,ComplexEvent都有两个long类型的属性start_ts,end_ts。通过setStart_ts(long start_ts)和setEnd_ts(long end_ts)就可以设置时间戳。基本事件PrimitiveEvent的开始时间start_ts和结束时间end_ts应相等。另外,新版本中在类SQL语句中通过SELECT语句AS _start_time_或AS _end_time_可以设置输出事件的时间戳。
2.2 读取方法
同理,在Java API中用getStart_ts()和getEnd_ts()可以获取一个事件的时间戳。在EPL类SQL语句中可以用_start_time_和_end_time_属性来读取事件的时间戳。
2.3示例的类SQL语句
这里的股票数据输入用到了将递增序列作为时间戳,而毫秒时间戳作为timestamp属性值。具体类SQL语句onbatch如下。
CREATE QUERY onbatch
SELECT *
FROM se:onbatchinput,data:onbatchinput,ee:onbatchinput
PATTERN se;data^*;ee
WHERE or(count(data.name)=8,ee.timestamp-se.timestamp>=5000)
WITHIN 10
BATCHMODE
CREATE QUERY onbatchinput
SELECT T1.price AS price,T1.name AS name,autoincrement('onbatch.inc1','0') AS _end_time_,T1._end_time_ AS timestamp,'data' AS type
FROM T1:stock
PATTERN T1
WITHIN 0
2.4 查询优化
单流条件性能要优于多流关联条件。如果WITHIN窗口大,那么ee和se作关联条件timestamp-se.timestamp>=5000会对整体性能造成一定影响。对本文示例,可用一个变量寄存器'last_o_id_'存储上批次输出ee事件序列号,EPL的WHERE条件去掉关联条件。
CREATE QUERY onbatch
SELECT set('last_o_id_',ee._end_time_)
FROM se:onbatchinput,data:onbatchinput,ee:onbatchinput
PATTERN se;data^+;ee
WHERE or(ee._end_time_> atoi(get('last_o_id_')) + 999 ,ee.timestamp>=atoi(get('last_o_id_'))+5000)
WITHIN 999
BATCHMODE
set(keystring,value) get(keystring)是2.0.22(sp2)以上版本增加的内置函数,功能为存取变量寄存器keystring的值。
SODBASE CEP用于轻松、高效实施数据监测、监控类、交易类、实时分析类项目。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio。