复杂事件处理引擎—Esper参考(事件部分)

时间:2021-09-18 07:22:35

声明:Esper官方未提供中文文档,以后更新的大部分内容,均来自官方文档。本人英语小白一枚,翻译内容仅供参考。有些翻译确实不忍直视,君可略过。

(有人可能会说,翻译的不好不如不翻,可能会误人子弟;不过我认为,在学习的过程中,尤其是初期可以用“大概”来形容掌握的知识程度,在以后的实践中详加琢磨,可深入理解,并纠正过去的错误认知。简翻或者误翻,如果少量,我感觉在初期的学习中可以接受。个人理解,轻拍!!)

第一章以及第二章的部分内容,网络上已经有人进行了翻译,不再赘述。链接如下:

http://blog.sina.com.cn/s/blog_4a5b4b930100xxn1.html   (任我飞的新浪微博)

关于第二章,补充如下内容

对象数组事件

事件在通过对象数组表示时,其事件属性就是该数组的元素值。属性可以使一个基本类型(数组)、java对象、map或者是另一个对象数组。

和Map事件类似,对象数组事件也可以消除java对象事件的使用,从而更容易地在运行时对事件类型等进行变更。比如,添加一个属性对于Map或者对象数组来说可以很方便的完成,但是对于java对象来说,需要对POJO进行重新编写,在属性扩展上,Map和对象数组有很大的优势。

在运行期间,通过运行配置API ConfigurationOperations对对象数组事件类型进行属性添加。注意,不能对事件类型的进行属性的更新和删除,只能做属性新增操作。另外,运行时配置API也允许清除对象数组事件类型,并且添加新的事件类型信息。

发送对象数组事件:通过运行API EPRuntime , 调用sendEvent(Object[] array, String eventTypeName),完成对象数组的发送。

发送数据时,Esper 不会对数据的长度、值类型进行校验。程序中必须确保发送事件的数组长度、属性值类型以及属性的顺序 与声明的对象数组事件类型一致。

对象数组属性

对象数组属性可以任意的类型。比如 java对象、Map、对象数组等。

为了使用对象数组事件,其类型名称、属性名称和属性类型可以通过Configuration 或者 create schema语法进行定义。

下面的代码定义了对象数组事件类型,创建了一个对象数组事件,并且发送该事件到Esper引擎。如下:

// Define  CarLocUpdateEvent event type (example for runtime-configuration interface)
String[] propertyNames = {"carId", "direction"}; // order is important
Object[] propertyTypes = {String.class, int.class}; // type order matches name order
epService.getEPAdministrator().getConfiguration().
addEventType("CarLocUpdateEvent", propertyNames, propertyTypes);

Statement中对事件的处理:

select carId from CarLocUpdateEvent.win:time(1 min) where direction = 1

发送事件时:

// Send an event
Object[] event = {carId, direction};
epRuntime.sendEvent(event, "CarLocUpdateEvent");

Esper引擎也可以查询Object[]中的java对象。Account是定义的java应用对象。

epRuntime.sendEvent(new Object[] {txn, account}, "TxnEvent");

//EPL
select account.id, account.rate * txn.amount
from TxnEvent.win:time(60 sec)
group by account.id

高级对象数组类型属性应用

属性的嵌套:

String[] propertyNamesUpdField = {"name", "addressLine1", "history"};
Object[] propertyTypesUpdField = {String.class, String.class,
UpdateHistory.class};
epService.getEPAdministrator().getConfiguration().
addEventType("UpdatedFieldType", propertyNamesUpdField,
propertyTypesUpdField);
String[] propertyNamesAccountUpdate = {"accountId", "fields"};
Object[] propertyTypesAccountUpdate = {long.class, "UpdatedFieldType"};
epService.getEPAdministrator().getConfiguration().
addEventType("AccountUpdate", propertyNamesAccountUpdate,
propertyTypesAccountUpdate);

发送事件:

Object[] updatedField = {"Joe Doe", "40 Popular Street", new UpdateHistory()};
Object[] accountUpdate = {10009901, updatedField};
epService.getEPRuntime().sendEvent(accountUpdate, "AccountUpdate");

EPL:

select accountId, fields.name, fields.addressLine1, fields.history.lastUpdate
from AccountUpdate

一对多的关系

下面的例子中salesPersons属性均对应一个数组:

String[] propertyNames = {"userids", "salesPersons", "items"};
Object[] propertyTypes = {int[].class, SalesPerson[].class, "OrderItem[]");
epService.getEPAdministrator().getConfiguration().
addEventType("SaleEvent", propertyNames, propertyTypes);
select userids[0], salesPersons[1].name,
items[1], items[1].price.amount from SaleEvent

另,各种事件类型的比较如下:

Java Object (POJO/Bean or other)

Map

XML Document

Performance

Good

Good

Not comparable and depending on use of XPath

Memory Use

Good

Good

Depends on DOM and XPath implementation used

Call Method on Event

Yes

Yes, if contains Object(s)

No

Nested, Indexed, Mapped and Dynamic Properties

Yes

Yes

Yes

Course-grained event syntax

Yes

Yes

Yes

Insert-into that Representation

Yes

Yes

No

Runtime Type Change

Reload class, yes

Yes

Yes

Create-schema Syntax

Yes

Yes

No, runtime and static configuration

从上面看出,用java对象作为事件类型表示方式,在性能、内存使用等都有不错的表现,而且支持的功能特性也较为全面。在一般的开发中,建议使用 java对象作为事件类型。