`
Josh_Persistence
  • 浏览: 1653692 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Esper中的事件之事件类型(三)

阅读更多

                                                              Esper事件类型

 

Esper是一个适合实时分析数据的内存计算引擎,前两节介绍了Esper的相关基础知识和入门例子,本节将介绍Esper能够处理的数据结构,即Esper中的“事件”。

Esper对事件有特殊的数据结构约定。能处理的事件结构有:POJO,java.util.Map,Object Array,XML

 

 

1.POJO

 

       对于POJO,Esper要求对每一个私有属性要有getter方法。Esper允许不必按照JavaBean规定的格式,但是getter方法是必须的。又或者可以在配置文件中配置可访问的方法来代替getter。简单示例如下:

 

 

    public class Person  
    {  
        String name;  
        int age;  
      
        public String getName()  
        {  
            return name;  
        }  
      
        public int getAge()  
        {  
            return age;  
        }  
    }  

 

 

Esper同样也能支持复杂的数据类型以及嵌套。稍微复杂的Person如下:

 

 

    import java.util.List;  
    import java.util.Map;  
      
    public class Person  
    {  
        String name;  
        int age;  
        List<Child> children;  
        Map<String, Integer> phones;  
        Address address;  
      
        public String getName()  
        {  
            return name;  
        }  
      
        public int getAge()  
        {  
            return age;  
        }  
      
        public List<Child> getChildren()  
        {  
            return children;  
        }  
      
        public Map<String, Integer> getPhones()  
        {  
            return phones;  
        }  
      
        public Address getAddress()  
        {  
            return address;  
        }  
          
    }  
      
    class Child  
    {  
        String name;  
        int gender;  
        // 省略getter方法  
    }  
      
    class Address  
    {  
        String road;  
        String street;  
        int houseNo;  
        // 省略getter方法  
    }  

 

 

如上所示,Esper能支持包含了集合类型和嵌套类的POJO,示例的EPL语句如下:

 

    // 当Person类型的事件中name为Jordan时,Esper能得到对应的age,children和address  
    select age,children,address from Person where name="Jordan"   

 

 

如果我不想要所有的child,而是想要第二个。并且我想得到家里的电话号码,那么Person需要改动一下:

 

    import java.util.List;  
    import java.util.Map;  
      
    public class Person  
    {  
        String name;  
        int age;  
        List<Child> children;  
        Map<String, Integer> phones;  
        Address address;  
      
        public String getName()  
        {  
            return name;  
        }  
      
        public int getAge()  
        {  
            return age;  
        }  
      
        public Child getChildren(int index)  
        {  
            return children.get(index);  
        }  
      
        public int getPhones(String name)  
        {  
            return phones.get(name);  
        }  
      
        public Address getAddress()  
        {  
            return address;  
        }  
        // Address,Child不变  
    }  

 对应的EPL如下:

 

 

    // 当Person类型的事件中name为Jordan时,Esper能得到对应的第二个孩子,家里的电话和家庭住址在哪条路上  
    select children[1], phones('home'), address.road where Person where name="Jordan"  

 

 

Esper支持事件的更新,对此Esper要求提供对应的setter方法。Person需要再有点小改动。示例如下:

 

    import java.util.List;  
    import java.util.Map;  
      
    public class Person  
    {  
        String name;  
        int age;  
        List<Child> children;  
        Map<String, Integer> phones;  
        Address address;  
      
        public String getName()  
        {  
            return name;  
        }  
      
        public int getAge()  
        {  
            return age;  
        }  
      
        public Child getChildren(int index)  
        {  
            return children.get(index);  
        }  
          
        // 此方法用于phones属性的更新  
        public void setPhones(String name, Integer number){  
            phones.put(name, number);  
        }  
      
        public int getPhones(String name)  
        {  
            return phones.get(name);  
        }  
      
        public Address getAddress()  
        {  
            return address;  
        }  
        // Address,Child不变  
    }  

 

 

对应的EPL如下:

 

    // 当Person类型的事件中name为Jordan时,更新家里的电话  
    update Person set phones('home') = 123456789 where name="Jordan"  

 Esper对POJO的支持基本上就是上面所说的,另外他还支持实现了多个接口类或者抽象类的POJO,使用方法和普通的POJO没什么区别,这里就不列举了。

 

 

2.Map

 

Esper支持原生Java Map结构的事件。相对于POJO来说,Map的结构更利于事件类型的热加载,毕竟不是class,所以不需要重启JVM。所以如果系统对重启比较敏感, 建议使用Map来定义事件的结构。Map的结构很简单,主要分为事件定义名和事件属性列表。我们继续拿Person来讲解.

 

import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
  
import com.espertech.esper.client.EPAdministrator;  
import com.espertech.esper.client.EPServiceProvider;  
import com.espertech.esper.client.EPServiceProviderManager;  
  
  
public class PersonMap  
{  
    public static void main(String[] args)  
    {  
        EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();  
        EPAdministrator admin = epService.getEPAdministrator();  
          
        // Person定义  
        Map<String,Object> person = new HashMap<String,Object>();  
        person.put("name", String.class);  
        person.put("age", int.class);  
        person.put("children", List.class);  
        person.put("phones", Map.class);  
          
        // 注册Person到Esper  
        admin.getConfiguration().addEventType("Person", person);  
    }  
} 

 

 

如上所示,Map结构的事件需要将属性名作为key,属性的数据类型作为value保存到Map中,然后再通过Esper的接口注册到Esper。其中addEventType的两个参数分别代表事件定义的名称和所定义的结构。

 

对应的EPL和POJO的没有区别

 

// 当Person类型的事件中name为luonanqin时,Esper能得到对应的age,children  
select age,children from Person where name="Jordan"

 Map对于嵌套类的定义比较特别。如果嵌套的类是POJO,那就如上面所示。如果嵌套的还是Map,那么定义方式就需要改变。我们为Person加上Address,示例如下:

 

 

    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
      
    import com.espertech.esper.client.EPAdministrator;  
    import com.espertech.esper.client.EPServiceProvider;  
    import com.espertech.esper.client.EPServiceProviderManager;  
      
    public class PersonMap  
    {  
        public static void main(String[] args)  
        {  
            EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();  
            EPAdministrator admin = epService.getEPAdministrator();  
      
            // Address定义  
            Map<String, Object> address = new HashMap<String, Object>();  
            address.put("road", String.class);  
            address.put("street", String.class);  
            address.put("houseNo", int.class);  
      
            // Person定义  
            Map<String, Object> person = new HashMap<String, Object>();  
            person.put("name", String.class);  
            person.put("age", int.class);  
            person.put("children", List.class);  
            person.put("phones", Map.class);  
            person.put("address", "Address");  
      
            // 注册Address到Esper  
            admin.getConfiguration().addEventType("Address", address);  
            // 注册Person到Esper  
            admin.getConfiguration().addEventType("Person", person);  
        }  
    }  

 

 

 

如上所示,有两个关键点:

1.Person在定义Address属性时,map的value不是Address.class,而是Address字符串,而这就代表引擎里的Address对应的Map结构定义

2.事件定义注册必须是Address先于Person,因为Person用到了Address,而引擎是根据Address注册时用的名字去查找Address定义的,所以如果名字写错,引擎就找不到Address了

如果Person有多个Address,则以数组方式定义Person的多个Address时,代码又变成下面的样子了:
person.put("addresses""Address[]"); 

 另外对于Map,Esper只支持增量更新,也就是说只能增加Map中的属性定义,而不能修改或者删除某个属性(实际上属性增多并不影响其处理性能,所以 没有删除在我看来也没什么。至于修改,也只能是先注销再注册了)。我们为Person增加一个gender属性,示例如下:

    import java.util.Arrays;  
    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
      
    import com.espertech.esper.client.EPAdministrator;  
    import com.espertech.esper.client.EPServiceProvider;  
    import com.espertech.esper.client.EPServiceProviderManager;  
    import com.espertech.esper.client.EventType;  
      
    public class PersonMap  
    {  
        public static void main(String[] args)  
        {  
            EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();  
            EPAdministrator admin = epService.getEPAdministrator();  
      
            // Address定义  
            Map<String, Object> address = new HashMap<String, Object>();  
            address.put("road", String.class);  
            address.put("street", String.class);  
            address.put("houseNo", int.class);  
      
            // Person定义  
            Map<String, Object> person = new HashMap<String, Object>();  
            person.put("name", String.class);  
            person.put("age", int.class);  
            person.put("children", List.class);  
            person.put("phones", Map.class);  
            person.put("address", "Address");  
      
            // 注册Address到Esper  
            admin.getConfiguration().addEventType("Address", address);  
            // 注册Person到Esper  
            admin.getConfiguration().addEventType("Person", person);  
      
            // 新增一个gender属性  
            person.put("gender", int.class);  
            admin.getConfiguration().updateMapEventType("Person", person);  
              
            /** 输出结果: 
             * Person props: [address, age, name, children, phones, gender] 
             */  
            EventType event = admin.getConfiguration().getEventType("Person");  
            System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));  
        }  
    }  

 

3.Object Array

 

对象数组和Map很像,基本没有差别。只是定义方式不一样,Esper同样也只支持增量更新。这里继续用Person作为例子:

    import java.util.Arrays;  
    import java.util.Map;  
      
    import com.espertech.esper.client.EPAdministrator;  
    import com.espertech.esper.client.EPServiceProvider;  
    import com.espertech.esper.client.EPServiceProviderManager;  
    import com.espertech.esper.client.EventType;  
      
    public class PersonArray  
    {  
      
        /** 
         * @param args 
         */  
        public static void main(String[] args)  
        {  
            EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();  
            EPAdministrator admin = epService.getEPAdministrator();  
      
            // Address定义  
            String[] addressPropNames = { "road", "street", "houseNo" };  
            Object[] addressPropTypes = { String.class, String.class, int.class };  
      
            // Child定义  
            String[] childPropNames = { "name", "age" };  
            Object[] childPropTypes = { String.class, int.class };  
      
            // Person定义  
            String[] personPropNames = { "name", "age", "children", "phones", "address" };  
            Object[] personPropTypes = { String.class, int.class, "Child[]", Map.class, "Address" };  
      
            // 注册Address到Esper  
            admin.getConfiguration().addEventType("Address", addressPropNames, addressPropTypes);  
            // 注册Child到Esper  
            admin.getConfiguration().addEventType("Child", childPropNames, childPropTypes);  
            // 注册Person到Esper  
            admin.getConfiguration().addEventType("Person", personPropNames, personPropTypes);  
      
            // 新增一个gender属性  
            admin.getConfiguration().updateObjectArrayEventType("Person", new String[] { "gender" }, new Object[] { int.class });  
      
            /** 输出结果: 
             * Person props: [name, age, children, phones, address, gender] 
             */  
            EventType event = admin.getConfiguration().getEventType("Person");  
            System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));  
        }  
    }  

 

上面的例子包含了对象数组这种事件格式的所有特性,我就不多加解释了。

 

 

4.XML

 

   以后更新

 

 

       上面列出的4种事件格式,在实际的应用过程中,对于其对应的事件数据,发送到引擎的方式有点区别。下一篇将会说到这一点:Esper 进程模型

 

 

 

 

0
0
分享到:
评论

相关推荐

    Esper 最新帮助文档

    过滤器和where子句是Esper中最常用的用于筛选事件的方法之一。它们可以帮助用户根据特定条件来选择感兴趣的事件。 **3.5 时间窗口** 时间窗口是一种重要的概念,用于处理在特定时间段内发生的事件。Esper支持多种...

    esper官方文档

    - **Object数组超类型**:Esper支持特定类型的Object数组作为事件的超类型。 - **高级Object数组属性类型**:对于更复杂的需求,Esper还提供了对高级Object数组属性类型的支持。 ##### XML事件 Esper还支持XML格式...

    esper所有jar包

    描述中的"esper相关所有jar"可能涵盖了以下几种类型的JAR文件: 1. **esper.jar**:这是Esper的核心库,包含了事件处理器、表达式语言、API接口等核心功能。 2. **esper-javadoc.jar**:提供了Esper API的Java文档...

    esper语法pdf版(下)

    1. **事件和事件类型接口**:这部分内容在文档的第13.5节进行了介绍,涵盖了事件和事件类型的定义及使用方法。 2. **管理接口**:用于创建和管理EPL(Esper处理语言)和模式语句,同时可以设置运行时配置。具体...

    esper reference

    Map事件类型属性是指Map属性本身也是一个事件类型的情况。这种机制可以用来表示复杂的数据结构。 **2.6.4.3 一对多关系** 在某些情况下,一个Map属性可能会关联到多个子属性。Esper支持这种一对多的关系,使得...

    esper官网文档中英文对照201-400页

    此外,在`@type`注解中还需要指定具体的事件类型名称,以便Esper知道如何解释这些事件。 **示例代码**: ```java public static EventBean[] myFunc(EPLMethodInvocationContext context) { EventBean[] events =...

    02-Esper参考手册

    Esper支持不同类型的事件属性,包括基本数据类型和复杂对象。 - **转义字符(Escape Characters)**:在定义事件属性时,有时需要使用特殊字符来表示某些难以直接表示的字符,如换行符。Esper支持使用转义字符来表示...

    esper官网文档中英文对照1-200页

    - **第三步:提供有关输入事件的信息**:解释如何定义事件的结构和属性,以便Esper能够正确地解析这些事件。 - **第四步:创建EPL语句并附加回调**:演示如何使用EPL编写查询语句,并定义回调函数处理查询结果。 ...

    Esper参考书1

    事件在Esper中的表示形式是通过事件类型(event type)来定义的,包含事件的有效信息。开发者可以根据需求配置预定义的事件类型,或者在运行时通过API或EPL的`create schema`语句动态创建。这种动态性使得Esper能够...

    esper官网文档中英文对照801-900页

    - **事件(Event)**:事件是Esper的基本处理单位,可以是任何类型的数据记录。 - **事件流(Event Stream)**:一系列连续发生的事件集合。 - **模式(Pattern)**:定义了哪些事件组合起来被认为是重要的,即需要触发...

    esper_reference

    - **优点**: 提高了系统的灵活性,可以在不改变事件类型的情况下增加新的功能。 **2.4 Fragment和Fragment Type** - **Fragment**: 表示事件的一部分。 - **Fragment Type**: 定义了Fragment的结构和类型。 - **...

    事件驱动架构

    - **事件定义和处理**:用户可以定义事件类型,并通过Esper提供的API来处理这些事件。 - **模式匹配**:支持复杂的模式匹配逻辑,如序列模式、时间窗口等。 - **高性能处理**:Esper采用高效的内存管理和查询优化...

    实时大数据分析平台与应用.pptx

    - **复杂事件处理引擎**(如 Esper、Drools):支持复杂的事件规则和模式匹配,适用于需要识别特定事件序列的场景。 ### 实时数据处理引擎的选择 选择合适的实时数据处理引擎需综合考虑以下因素: - **应用场景**...

    Rifidi Edge Server v1.3开发者文档

    - **Esper集成**:Esper是一个流行的复杂事件处理引擎,可以用于实时数据分析。 - **事件处理**:定义事件处理规则。 ##### 5. OSGi控制台集成 - **OSGi框架**:Rifidi Edge Server基于OSGi框架构建。 - **控制台...

Global site tag (gtag.js) - Google Analytics