#esper
#esper
Вопрос:
Я новичок в Esper и создал небольшую программу, которая передает события Esper в виде Map.
Я добавил слушателя, и все работает, как ожидалось, однако при выполнении сложных запросов, таких как count(*) в течение временных окон, я изо всех сил пытаюсь вернуть результат в виде java.util.Map. Как я могу, независимо от результата запроса, получить результаты в виде стандартной карты для дальнейшей обработки?
private class EsperUpdateListener implements UpdateListener {
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
System.out.println("Found new event!");
if(newEvents != null) {
System.out.println("newEvents (" newEvents.length "):");
for (EventBean e : newEvents) {
System.out.println(" " e.toString() "(" e.getEventType().getName() ")");
System.out.println(" " e.getUnderlying().toString());
for (Map.Entry<String,Object> entry : e.getUnderlying().getEntrySet()) {
String key = entry.getKey();
String val = (String)entry.getValue();
System.out.println(" " key ": " val);
}
}
}
if(oldEvents != null) {
System.out.println("oldEvents:");
for (EventBean e : oldEvents) {
System.out.println(" " e.toString() "(" e.getEventType().getName() ")");
}
}
}
}
Я попробовал приведенный выше код, но он жалуется, что getUnderlying возвращает объект, а не карту. Я попробовал кастинг, который вроде как работает, но не без предупреждений:
предупреждение: [снято] непроверенное приведение
Map<String,Object> emap = (Map<String,Object>)e.getUnderlying();
Ответ №1:
Когда вы регистрируете UpdateListener, он получает экземпляры EventBean. «eventBean.getUnderlying ()» возвращает объект представления и в данном случае карту.
Комментарии:
1. Он возвращает объект. Когда можно с уверенностью предположить, что это на самом деле Карта? Причина, по которой я спрашиваю, заключается в том, что, когда я явно применяю его к карте, компилятор жалуется, что «предупреждение: [непроверено] непроверенное приведение».
2. Удалит ли проверка экземпляра базового компонента эту ошибку?
3. Да, предупреждения не будет, если вы выполните надлежащую
instanceof
проверку базового объекта, например, следующим образом:if (eventBean.getUnderlying() instanceof HashMap<?, ?>) // process data
Ответ №2:
Вы регистрируете тип события следующим образом
Map<String, Object> log = new HashMap<>();
log.put("referer", String.class);
log.put("request", String.class);
log.put("logtype", String.class);
log.put("user_agent", String.class);
log.put("@cid", String.class);
log.put("http_version", String.class);
log.put("user_agent_type", String.class);
log.put("status", int.class);
log.put("@timestamp", String.class);
log.put("server_ip", String.class);
log.put("client_ip", String.class);
log.put("method", String.class);
log.put("write_bytes", int.class);
log.put("read_bytes", int.class);
//register
epServiceProvider.getEPAdministrator().getConfiguration().addEventType("LogType", log);
В UpdateListener используйте event.getUnderlying(), и вы получите карту.