2014-06-28 36 views
1

我是Esper的新手,並創建了一個以Map形式提供Esper事件的小程序。Esper將結果轉換爲java.util.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()」返回表示對象,在這種情況下是一個Map。

+0

它返回Object。什麼時候可以安全地假設這實際上是一個Map?我問的原因是,當我明確地將它轉換爲地圖時,編譯器抱怨「警告:[取消選中]未選中投射」。 – agnsaft

+0

檢查底層bean的實例是否會刪除此錯誤? – agnsaft

+0

是的,如果你像下面這樣對底層對象進行適當的'instanceof'檢查沒有警告:'if(eventBean.getUnderlying()instanceof HashMap )// process data' – Simon

0

您註冊事件類型這樣

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(),你會得到一個地圖。