Esper学习笔记04-MAP事件类型
Esper学习笔记04-MAP事件类型
东皇巴顿 发表于5个月前
Esper学习笔记04-MAP事件类型
  • 发表于 5个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

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

 

Java代码 

  1. import java.util.HashMap;    
  2. import java.util.List;    
  3. import java.util.Map;    
  4.     
  5. import com.espertech.esper.client.EPAdministrator;    
  6. import com.espertech.esper.client.EPServiceProvider;    
  7. import com.espertech.esper.client.EPServiceProviderManager;    
  8.     
  9.     
  10. public class PersonMap    
  11. {    
  12.     public static void main(String[] args)    
  13.     {    
  14.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  15.         EPAdministrator admin = epService.getEPAdministrator();    
  16.             
  17.         // Person定义    
  18.         Map<String,Object> person = new HashMap<String,Object>();    
  19.         person.put("name", String.class);    
  20.         person.put("age", int.class);    
  21.         person.put("children", List.class);    
  22.         person.put("phones", Map.class);    
  23.             
  24.         // 注册Person到Esper    
  25.         admin.getConfiguration().addEventType("Person", person);    
  26.     }    
  27. }   

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

对应的EPL和POJO的没有区别

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

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

Java代码 

  1. import java.util.HashMap;    
  2. import java.util.List;    
  3. import java.util.Map;    
  4.     
  5. import com.espertech.esper.client.EPAdministrator;    
  6. import com.espertech.esper.client.EPServiceProvider;    
  7. import com.espertech.esper.client.EPServiceProviderManager;    
  8.     
  9. public class PersonMap    
  10. {    
  11.     public static void main(String[] args)    
  12.     {    
  13.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  14.         EPAdministrator admin = epService.getEPAdministrator();    
  15.     
  16.         // Address定义    
  17.         Map<String, Object> address = new HashMap<String, Object>();    
  18.         address.put("road", String.class);    
  19.         address.put("street", String.class);    
  20.         address.put("houseNo", int.class);    
  21.     
  22.         // Person定义    
  23.         Map<String, Object> person = new HashMap<String, Object>();    
  24.         person.put("name", String.class);    
  25.         person.put("age", int.class);    
  26.         person.put("children", List.class);    
  27.         person.put("phones", Map.class);    
  28.         person.put("address", "Address");    
  29.     
  30.         // 注册Address到Esper    
  31.         admin.getConfiguration().addEventType("Address", address);    
  32.         // 注册Person到Esper    
  33.         admin.getConfiguration().addEventType("Person", person);    
  34.     }    
  35. }    

 

Java代码 

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

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

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

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

Java代码 

  1. import java.util.Arrays;    
  2. import java.util.HashMap;    
  3. import java.util.List;    
  4. import java.util.Map;    
  5.     
  6. import com.espertech.esper.client.EPAdministrator;    
  7. import com.espertech.esper.client.EPServiceProvider;    
  8. import com.espertech.esper.client.EPServiceProviderManager;    
  9. import com.espertech.esper.client.EventType;    
  10.     
  11. public class PersonMap    
  12. {    
  13.     public static void main(String[] args)    
  14.     {    
  15.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  16.         EPAdministrator admin = epService.getEPAdministrator();    
  17.     
  18.         // Address定义    
  19.         Map<String, Object> address = new HashMap<String, Object>();    
  20.         address.put("road", String.class);    
  21.         address.put("street", String.class);    
  22.         address.put("houseNo", int.class);    
  23.     
  24.         // Person定义    
  25.         Map<String, Object> person = new HashMap<String, Object>();    
  26.         person.put("name", String.class);    
  27.         person.put("age", int.class);    
  28.         person.put("children", List.class);    
  29.         person.put("phones", Map.class);    
  30.         person.put("address", "Address");    
  31.     
  32.         // 注册Address到Esper    
  33.         admin.getConfiguration().addEventType("Address", address);    
  34.         // 注册Person到Esper    
  35.         admin.getConfiguration().addEventType("Person", person);    
  36.     
  37.         // 新增一个gender属性    
  38.         person.put("gender", int.class);    
  39.         admin.getConfiguration().updateMapEventType("Person", person);    
  40.             
  41.         /** 输出结果:  
  42.          * Person props: [address, age, name, children, phones, gender]  
  43.          */    
  44.         EventType event = admin.getConfiguration().getEventType("Person");    
  45.         System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));    
  46.     }    
  47. }    

 

3.Object Array

 

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

Java代码 

  1. import java.util.Arrays;    
  2. import java.util.Map;    
  3.     
  4. import com.espertech.esper.client.EPAdministrator;    
  5. import com.espertech.esper.client.EPServiceProvider;    
  6. import com.espertech.esper.client.EPServiceProviderManager;    
  7. import com.espertech.esper.client.EventType;    
  8.     
  9. public class PersonArray    
  10. {    
  11.     
  12.     /**  
  13.      * @param args  
  14.      */    
  15.     public static void main(String[] args)    
  16.     {    
  17.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();    
  18.         EPAdministrator admin = epService.getEPAdministrator();    
  19.     
  20.         // Address定义    
  21.         String[] addressPropNames = { "road", "street", "houseNo" };    
  22.         Object[] addressPropTypes = { String.class, String.class, int.class };    
  23.     
  24.         // Child定义    
  25.         String[] childPropNames = { "name", "age" };    
  26.         Object[] childPropTypes = { String.class, int.class };    
  27.     
  28.         // Person定义    
  29.         String[] personPropNames = { "name", "age", "children", "phones", "address" };    
  30.         Object[] personPropTypes = { String.class, int.class, "Child[]", Map.class, "Address" };    
  31.     
  32.         // 注册Address到Esper    
  33.         admin.getConfiguration().addEventType("Address", addressPropNames, addressPropTypes);    
  34.         // 注册Child到Esper    
  35.         admin.getConfiguration().addEventType("Child", childPropNames, childPropTypes);    
  36.         // 注册Person到Esper    
  37.         admin.getConfiguration().addEventType("Person", personPropNames, personPropTypes);    
  38.     
  39.         // 新增一个gender属性    
  40.         admin.getConfiguration().updateObjectArrayEventType("Person", new String[] { "gender" }, new Object[] { int.class });    
  41.     
  42.         /** 输出结果:  
  43.          * Person props: [name, age, children, phones, address, gender]  
  44.          */    
  45.         EventType event = admin.getConfiguration().getEventType("Person");    
  46.         System.out.println("Person props: " + Arrays.asList(event.getPropertyNames()));    
  47.     }    
  48. }    

 

上面的例子包含了对象数组这种事件格式的所有特性。

共有 人打赏支持
粉丝 4
博文 64
码字总数 66825
×
东皇巴顿
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: