上篇博客介绍了如何利用esper进行POJO嵌套事件的监听处理操作,这篇来说一下Map事件监听和处理。
如果esper要进行的事Map事件那么首先是需要建立Map对象的。具体的建立方法如下,
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);
admin.getConfiguration().addEventType("Person",person);
通过addEventType方法来进行事件注册,这时候事件名称为Person,这个和POJO对象事件其实是一样的,只是POJO对象为对象名称,这里用户可以自定义事件名。这时候用户书写EPL语句的时候from后面就是需要跟着Person。
具体的EPL语句就可以如下一样,
String epl = "select age,children from Person where name='cjq'";
其他的开启引擎和传入事件操作和前两篇博客一样
public static void main(String[] args) {
EPServiceProvider epService=EPServiceProviderManager.getDefaultProvider();
EPAdministrator admin=epService.getEPAdministrator();
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);
admin.getConfiguration().addEventType("Person",person);
String epl = "select age,children from Person where name='cjq'";
EPStatement state = admin.createEPL(epl);
state.addListener(new PersonMapListener());
EPRuntime runtime = epService.getEPRuntime();
Map<String,Object> person1=new HashMap<String,Object>();
List<String> children=new ArrayList<String>();
children.add("x");
children.add("y");
children.add("z");
Map<String,Integer> phones=new HashMap<String,Integer>();
phones.put("a", 123);
phones.put("b", 234);
person1.put("name","cjq");
person1.put("age",12);
person1.put("children", children);
person1.put("phones", phones);
runtime.sendEvent(person1, "Person");
}
之后完成监听代码为
class PersonMapListener implements UpdateListener {
@Override
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
if (newEvents != null) {
Integer age = (Integer) newEvents[0].get("age");
System.out.println("age is:"+age);
}
}
}
此时运行之后会输出下面的结果,