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学习进阶篇(三):自己写输入输出适配器

0 0
原创粉丝点击