Esper преобразует результат в java.util.Map

#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(), и вы получите карту.