【问题标题】:Esper convert result to java.util.MapEsper 将结果转换为 java.util.Map
【发布时间】:2016-08-24 10:40:59
【问题描述】:

我是 Esper 的新手,我创建了一个小程序,以 Map 的形式提供 Esper 事件。

我添加了一个侦听器,一切都按预期工作,但是,当在一个时间窗口内执行复杂的查询(如 count(*))时,我很难将结果作为 java.util.Map 取回。无论查询结果如何,我如何才能将结果作为标准 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 返回一个对象,而不是地图。我尝试了投射,这有点工作,但并非没有警告:

警告:[unchecked] unchecked cast

Map<String,Object> emap = (Map<String,Object>)e.getUnderlying();

【问题讨论】:

    标签: esper


    【解决方案1】:

    当您注册一个 UpdateListener 时,它会接收 EventBean 实例。 “eventBean.getUnderlying()”返回表示对象,在本例中为 Map。

    【讨论】:

    • 它返回对象。什么时候可以安全地假设这实际上是一张地图?我问的原因是,当我明确地将其转换为地图时,编译器会抱怨“警告:[unchecked] unchecked cast”。
    • 检查底层 bean 的实例会消除这个错误吗?
    • 是的,如果您对底层对象进行正确的instanceof 检查,则不会发出警告,如下所示:if (eventBean.getUnderlying() instanceof HashMap&lt;?, ?&gt;) // 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() 你会得到一个 Map。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2013-07-22
      • 2011-03-08
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      相关资源
      最近更新 更多