SODBASE CEP学习(二):运行第一个EPL例子
来源:互联网 发布:淘宝 非常小非常小的店 编辑:程序博客网 时间:2024/05/17 03:32
开发者社区活动,SODBASE产品用户现在可以领礼品啦
为了让大家理解SODBASE CEP的工作原理,直接写一个CEP模型的XML,以API调用的方式运行。不想写XML,直接使用图形工具的同学,请直接跳过本文。不想用API写程序,直接用GUI操作服务器的同学,也请直接跳过本文。用得到的时候可以再返回过来看。
1.示例操作步骤
(1)下载Java-API-Example,解压导入Eclipse中。只需将lib下的jar包添加到build path中,不用依赖其它工程(projects)。
(2)运行Example.java,筛选价格大于50的数据
(3)结果输出如下
'start cep model CEPModelPrimaryKey [modelname=example, modelspacename=, version=1.0, serveraddress=]','','2015-04-29 04:48:21Wed Apr 29 16:48:21 CST 2015 price: 73.5247091124538, Wed Apr 29 16:48:21 CST 2015 Wed Apr 29 16:48:22 CST 2015 price: 71.22182321052489, Wed Apr 29 16:48:22 CST 2015 Wed Apr 29 16:48:23 CST 2015 price: 72.81982202535718, Wed Apr 29 16:48:23 CST 2015 Wed Apr 29 16:48:24 CST 2015 price: 98.18584015152344, Wed Apr 29 16:48:24 CST 2015 'stop cep model CEPModelPrimaryKey [modelname=example, modelspacename=, version=1.0, serveraddress=]','','2015-04-29 04:48:27
2.工作原理
2.1 模型文件和EPL语句
CEP模型XML文件example.xml
<?xml version="1.0" encoding="UTF-8"?><GraphModelData> <CEPSoftwareVersion>2</CEPSoftwareVersion> <inputAdaptors> <inputAdaptorClassName>com.sodbase.inputadaptor.StubInputAdaptor</inputAdaptorClassName> <adaptorParams>stock</adaptorParams> <isExternal>false</isExternal> </inputAdaptors> <SODSQLs>CREATE QUERY example SELECT T1.price AS price FROM T1:stock PATTERN T1 WHERE T1.price>50 WITHIN 0 </SODSQLs> <outputAdaptors> <isOutputAsSelection>true</isOutputAsSelection> <outputAdaptorClassName>com.example.PrintEventOutputAdaptor</outputAdaptorClassName> <isExternal>false</isExternal> <queryName>example</queryName> </outputAdaptors> <modelName>example</modelName> <modelVersion>1.0</modelVersion> <modelDescription></modelDescription></GraphModelData>
其核心是EPL语句,也即SODSQL语句
CREATE QUERY example SELECT T1.price AS price FROM T1:stock PATTERN T1 WHERE T1.price>50 WITHIN 0
T1是事件名称,从stock流中取数据。这儿有两个地方与传统SQL不同,也是流数据处理的关键点。
第一个地方是PATTERN T1 用来表示复杂事件模式,这里是一个很简单的filter操作,没有什么模式,就只用一个事件名称表达就可以了。模式的写法,后文还会介绍。
第二个地方是WITHIN 0 滑动窗口的大小,是指要检测的复合事件的结束时间和开始时间的差不大于窗口的长度。这里的Filter不需要窗口。
2.2 输入适配器
inputAdaptorClassName用的是StubInputAdaptor输入适配器,这种适配器表示数据是从此CEP单元模型的外部得到的,本例中我们是编程写入的,参见下文Example.java源代码,另外StubInputAdaptor输入还可以作为由其它单元模型级联输入,后文有机会将介绍。
所有输入适配器的第一个参数默认都是流的名称,这里stock就是我们数据流的名称了。注意流名称和事件名T1区别,T1是指stock上的一个个数据或称为事件。
2.3 输出适配器
outputAdaptorClassName设置的是com.example.PrintEventOutputAdaptor输出适配器,屏幕打印输出。是自己写的代码,即com.example.PrintEventOutputAdaptor类,实现中output方法即可,如下面代码所示。
public void output(List<Event> eventlist){PrintStream out = System.out;while (eventlist.size() > 0){Event e = eventlist.remove(0);out.flush();out.println();if (e instanceof ComplexEvent){outputComplexEvent((ComplexEvent) e, out);out.flush();} else if (e instanceof PrimitiveEvent){outputPrimitiveEvent((PrimitiveEvent)e, out);out.flush();} else{out.println("error");}}}
2.4. 运行模型
运行模型有三种方式,第一种,以XML文件来运行,通过GraphModelExecutorUtil类的runXML来运行。
public class Example{ /** * @param args */ public static void main(String[] args) { //执行CEP语句和模型 GraphModelExecutorUtil gme = new GraphModelExecutorUtil(); gme.runXML("files/example.xml"); /* GraphModelData cepmodel = GraphModelExecutorUtil.convertXmlToObject("files/example.xml"); gme.runObject(cepmodel); */ try { // simulate the data StubInputAdaptor inputAdaptor = new StubInputAdaptor(); // 数据输入 inputAdaptor.setStreamName("stock"); Random r = new Random(); int count = 0; while (count<=10) { PrimitiveEvent p = new PrimitiveEvent(); long time = new Date().getTime(); p.setStart_ts(time); p.setEnd_ts(time); p.getAttributeMap().put("name", new ValueType("Google", "string")); p.getAttributeMap().put( "price", new ValueType(String.valueOf(r.nextDouble() * 100), "double")); p.getAttributeMap() .put("volumn", new ValueType("20", "double")); inputAdaptor.putEventToStream(p); Thread.sleep(500); count++; } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } gme.stopModel("example", "1.0"); }}第二种,直接以XML字符串为参数
XMLString=" <?xml version="1.0" .....</GraphModelData>"
gme.runXMLString(XMLString);
第三种,得到GraphModelData对象,此对象可以编辑,也可以自己构建,也可以从XML转化而来,就是XML的Java 对象表达
GraphModelData cepmodel = GraphModelExecutorUtil.convertXmlToObject("files/example.xml");
gme.runModel(cepmodel)
本文示例完整源码可到 http://www.sodbase.com/page/service/product.php 下载,请选择"嵌入式版Java开发示例"下载最新版示例。
SODBASE CEP用于轻松、高效实施数据监测、监控类、实时交易类项目。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio。嵌入式方式编程参见运行第一个EPL例子。与Storm集成参见EPL与Storm集成。
参考:
SODBASE CEP学习进阶篇(三):自己写输入输出适配器
- SODBASE CEP学习(二):运行第一个EPL例子
- SODBASE CEP学习(十):在线动态修改EPL规则
- SODBASE CEP学习(十三):EPL常用函数
- SODBASE CEP学习(十五):常见场景EPL示例
- SODBASE CEP学习(四):类SQL语言EPL与Storm或jStorm集成
- SODBASE CEP学习(五):流式计算中的类SQL语言EPL
- SODBASE CEP学习(一):SODBASE CEP简介
- SODBASE CEP学习进阶篇(二):日志采集-Flume
- SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-滑动窗口
- SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存
- SODBASE CEP学习进阶篇(二)续:日志采集-Logstash、Kafka和CEP集成
- SODBASE CEP学习(十一):分布式集群
- SODBASE CEP学习(三):GUI建模工具SODBASE Studio和CEP服务器
- SODBASE CEP学习进阶篇(七):SODBASE CEP与Spark streaming集成
- SODBASE CEP学习进阶篇(二)续:日志采集之外的APM探针方法
- SODBASE CEP学习进阶篇(二)续:日志采集-Flume Syslog采集
- SODBASE CEP学习(八):高可用性HA
- SODBASE CEP学习(十二):规则模板、阈值和用户界面
- 文本分类,数据挖掘和机器学习
- iOS中Cookie介绍
- Java Socket实战之八 socket提升
- 使用Ionic + Apache Cordova开发跨平台混合型的移动应用
- sliverlight 在winserver2003上错误code :2014,无法下载sliverlight程序解决办法
- SODBASE CEP学习(二):运行第一个EPL例子
- c++ 排序
- spring-mongodb-DBRef的运用
- Enterprise architect 与SVN协同使用
- eclipse 从Git导入maven项目
- 1007. Maximum Subsequence Sum (25)
- cmake安装等,(红帽linux下)http://www.linuxidc.com/Linux/2012-10/72216.htm
- 编译错误:无法在要求对象展开的函数中使用 __try
- android google map V2画圆