程序员的量化交易之路(5)--Esper之Map事件(4)
实现事件的类可以是一个实现java.util.Map接口的类。映射事件的事件属性是其通过get方法能够获得的值。
和数组对象事件类型一样,映射事件类型考虑了系统中的综合类型,是的不需要使用Java类来描述事件类型,这是的更容易在运行时更改事件,或者从其他类型生成类型信息。
一个给定的Map事件类型可以有一个或者多个超类型,这些超类型也必须是map 事件类型。所以在超类中可以获取的属性在该映射事件中也可以获得。此外,在EPL中任何一个Map超类被使用,那么其子类都可以匹配该表达式。
应用可以通过configurationoperation(配置操作)updateMapEventType在运行时为一个已经存在的映射事件类型添加属性。属性只能增加,不能更新或者删除。运行时配置允许删除一个映射事件类型并修改后再添加回系统中。
通过数组可以在映射事件类型中表示一对多的关系。映射事件类型中的一个属性可以是一个内置类型的数组,java对象的数组,Map的数组以及数组的数组,都是可以的。
引擎通过EPRuntime接口中的sendEvent(Map map,String eventTypeName)方法处理java.util.Map事件。映射中的条目代表这属性。关键字必须是java.util.String类型,为了使引擎能够通过匹配名字取查找事件属性。
引擎并不验证映射事件属性名和值。应用必须保证事件属性匹配create schema属性名和类型。
2.6.2 映射属性映射事件属性可以是任意类型。它可以是Java应用对象、java.util.Map类型、Object[]数组类型等。这些复杂的类型可以提供一下更强的功能:
1) 使用java application object的属性可以嵌套、索引、映射以及使用动态属性等。
2) 使用Map作为事件属性可以表达更为复杂的事件,并且该属性可以被嵌套、索引、动态属性等。
3) 使用数组对象作为事件属性也是如此。。。。
为了使用映射事件类型,事件类型名称和属性名以及属性类型等必须让引擎知道,可以通过Configuration或者create schema EPL语法实现。具体例子参见5.15节“Declaring anEventType:Create Schema”和第16.4.2节“Eventsrepresed by java.util.Map”
下面的代码定义了一个映射事件类型,穿件一个映射事件并将该事件发送到引擎中。示例中通过运行时配置接口(create schema 和静态配置也可以)。
// Define CarLocUpdateEvent event type(example for runtime-configuration interface)
Map String, Object def = newHashMap String, Object
def.put("carId", String.class);
def.put("direction", int.class);
epService.getEPAdministrator().getConfiguration().
addEventType("CarLocUpdateEvent", def);
CarLocUpdateEvent事件类型可以在如下语句中使用:
select carId fromCarLocUpdateEvent.win:time(1 min) where direction = 1
创建一个CarLocUpdateEvent事件并将它发送到引擎中:
// Create a CarLocUpdateEvent event andsend it into the engine for processing
Map String, Object event = newHashMap String, Object
event.put("carId", carId);
event.put("direction",direction);
epRuntime.sendEvent(event,"CarLocUpdateEvent");
通过嵌套属性,引擎允许把一个对象当做映射事件中的属性值来查询。这样Map就可以用来聚合多个数据结构到单个事件中。下面是这样的一个例子。
Map event = new HashMap();
event.put("txn", txn);
event.put("account", account);
epRuntime.sendEvent(event,"TxnEvent");
一个示例语句可以如下:
select account.id, account.rate *txn.amount
from TxnEvent.win:time(60 sec)
group by account.id
2.6.3 映射超类(Map Supertypes)
你的映射事件类型可以声明一个或者多个超类。
映射事件的超类也必须是映射事件类型。超类的所有属性名和类型在子类中都可以获取,并且是同名覆盖。此外,在EPL中使用超类的地方,子类的对象也可以匹配该表达式。
下面AccountUpdate有一个BaseUpdate超类。
epService.getEPAdministrator().getConfiguration().
addEventType("AccountUpdate", accountUpdateDef,
new String[] {"BaseUpdate"});
下面是EPL语句,子类对象都可以匹配:
// Receive BaseUpdate and any subtypesincluding subtypes of subtypes
select * from BaseUpdate
2.6.4 映射属性类型的高级用法 2.6.4.1 嵌套属性
下面通过一个示例说明映射事件的嵌套属性。
事件类型的定义:
Map String, Object updatedFieldDef =new HashMap String, Object
updatedFieldDef.put("name",String.class);
updatedFieldDef.put("addressLine1",String.class);
updatedFieldDef.put("history",UpdateHistory.class);
epService.getEPAdministrator().getConfiguration().
addEventType("UpdatedFieldType", updatedFieldDef);
Map String, Object accountUpdateDef= new HashMap String, Object
accountUpdateDef.put("accountId",long.class);
accountUpdateDef.put("fields","UpdatedFieldType");
// the latter can also be: accountUpdateDef.put("fields",updatedFieldDef);
epService.getEPAdministrator().getConfiguration().
addEventType("AccountUpdate",accountUpdateDef);
定义和发送事件:
Map String, Object updatedField =new HashMap String, Object
updatedField.put("name","Joe Doe");
updatedField.put("addressLine1","40 Popular Street");
updatedField.put("history", newUpdateHistory());
Map String, Object accountUpdate =new HashMap String, Object
accountUpdate.put("accountId",10009901);
accountUpdate.put("fields",updatedField);
epService.getEPRuntime().sendEvent(accountUpdate,"AccountUpdate");
最后查询事件:
select accountId, fields.name, fields.addressLine1,fields.history.lastUpdate
from AccountUpdate
2.6.4.2 一对多模型
使用数组作为属性。
Map String, Object sale = newHashMap String, Object
sale.put("userids", int[].class);
sale.put("salesPersons",SalesPerson[].class);
sale.put("items","OrderItem[]"); // Theproperty type is the name itself appended by []
epService.getEPAdministrator().getConfiguration().
addEventType("SaleEvent", sale);
select userids[0], salesPersons[1].name,
items[1], items[1].price.amount from SaleEvent
你kin你擦!阿里终于肯把内部高并发编程高阶笔记开源出来了 “高并发”三字是近几年开发圈子里热议的一个话题,可能程序员之间闲下来就会讨论所谓的“高并发经验”。值得注意的是即使你和高并发天天打交道,也不一定能获得高并发的经验,高并发只是一个结果,并不是过程。想要玩转高并发,基础最重要,大并发面前,靠得住的只有人,是人来根据具体的应用场景去解决具体的问题。
这16种原生函数和属性的区别,你真的知道吗? 精心收集,高级前端必备知识,快快打包带走 原生内置了很多API, 作用类似,却也有差千差万别,了解其区别,掌握前端基础,是修炼上层,成为前端高级工程师的必备知识,让我们一起来分类归纳,一起成长吧。
程序员,一个令人向往的职业,看起来有着高薪酬、高技术,还是一群高智商、头脑灵活的人。事实上,程序员的工作,让人非常抓狂,程序员的生活,异常线性单调。
作为一名不爱凑热闹的人,今天一直在持续关注一个热点事件——WePhone开发者自杀,即使前几天热议的孕妇跳楼新闻我都不太关注,但是这个事件却让我深深的震撼,花了几个小时在微博上搜索了相关的信息,去了解事情的始末,也去看了网络上对此事件的一些评判,太多的杂音让个人的产生一些想法和大家一起探讨。
相关文章
- jquery 自定义事件绑定与触发 $.one与$.bind效果对比实例
- ZooKeeper客户端事件串行化处理
- 淘宝上倒卖新浪微盘事件来龙去脉——谈谈巧用IMEI
- vue子组件的自定义事件
- 【REACT NATIVE 系列教程之一】触摸事件的两种形式与四种TOUCHABLE组件详解
- [转] WinForm实现移除控件某个事件的方法
- 如何使用 controllerExtensions 给 SAP Fiori Elements List Report 的表格注册事件响应函数
- SAP 电商云 Spartacus UI 如何在应用程序里捕捉到成功下单的事件
- Android怎样监听蓝牙耳机的按键事件
- Qt模拟鼠标点击事件
- chromium 处理 addEventListener 事件