上篇博客介绍了如何利用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); } } }
此时运行之后会输出下面的结果,
通过这三篇博客已经对esper的事件处理有一定的认识了,其实很简单的,就是开启引擎,编写事件代码,编写监听代码三步足矣。