前言
Esper 的事件类型有三种,分别是 对象、Map 、数组
官方推荐使用对象,宣称处理对象速度会更快。但是在有些复杂事件分析的场景,事件中的字段是可以用户自定义的。
这时候使用Map 就可以 热更新其类型。主体代码如下:
EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
EPAdministrator admin = epService.getEPAdministrator();
Map \<String, Object> eventTypeMap = new HashMap \<>();
eventTypeMap.put("name", String.class);
eventTypeMap.put("age", int.class);
admin.getConfiguration().addEventType("Person", eventTypeMap);
String epl = "select * from Person";
EPStatement state = admin.createEPL(epl);
state.addListener(((newEvents, oldEvents) \-> {
for (EventBean eventBean : newEvents) {
System.out.println(Arrays.asList(eventBean.getEventType().getPropertyNames()));
System.out.println(Arrays.asList(eventBean.getEventType().getPropertyType("age")));
}
}));
EPRuntime runtime = epService.getEPRuntime();
//发送一个对象 ....
runtime.sendEvent(....., "Person");
//现在在Person Map事件对象中添加一个address 属性
eventTypeMap.put("address", String.class);
// 更新类型
//admin.getConfiguration().updateMapEventType("Person", eventTypeMap);
//再发送一个对象 ....
runtime.sendEvent(....., "Person");
以上程序运行结果为
[name, age]
[class java.lang.Integer]
[name, age, address]
[class java.lang.Integer]
这些都在预想之中
问题:无法对类型属性修改和删除
上网查阅资料,发现是无法对map对象属性的修改和删除的。
目前比较蠢的方案是,注销所有的 statement 移除类型。重新添加类型,重新创建statement 和监听,但是因为系统中 规则也比较多 如果执行这个操作,第一对性能有影响,第二是实时分析的数据会有一段时间会断掉。大家有没有遇到这种情况,该如何解决??