2012-04-11 50 views
5

我寫了一些簡單的clojure代碼來訪問twitter流api。我的代碼本質上是一樣的,在Twitter的API文檔中描述的例子的代碼:使用clojure獲取「java.io.EOFException:JSON錯誤」twitter-api

(def ^:dynamic *custom-streaming-callback* 
    (AsyncStreamingCallback. (comp println #(:text %) json/read-json #(str %2)) 
          (comp println response-return-everything) 
          exception-print)) 

(defn start-filtering [] 
    (statuses-filter :params {:follow 12345} 
        :oauth-creds *creds* 
        :callbacks *custom-streaming-callback*)) 

我以下關於特定用戶鳴叫和使用OAuth進行認證(未示出)。當我運行開始過濾方法並且用twitter打開一個連接時,一切都很適合咒語,但是如果流在一段時間內(30秒左右)處於非活動狀態,也就是說沒有關於這個特定用戶的推文正在下沉,發生以下錯誤:

#<EOFException java.io.EOFException: JSON error (end-of-file)> 

我從推特文檔中假設,當使用流連接時,twitter會使流無限期打開。我必須做出一些不正確的假設。我目前正在探索clojure twitter-api代碼以瞭解發生了什麼,但我認爲更多的眼睛會幫助我更快地瞭解這一點。

+0

這是一個好主意,在twitter-api的github問題跟蹤器上打開一個問題。除非作者投身SO並看到這一點,否則任何人都不會知道如何解決這個問題。 – Rayne 2012-04-28 04:17:40

回答

3

我有同樣的問題,你有。正如您發現的那樣,如果在過去的三十秒內沒有收到任何數據,則流式傳輸功能會發出一條空的消息。 嘗試將此讀爲json,然後導致您看到的EOF異常。

我不知道有任何方法來阻止這些調用。在我的情況下,我用一個簡單的條件解決了這個問題,當沒有JSON可讀時,該條件返回空映射。

(if-not (clojure.string/blank? %) 
    (json/read-str % :key-fn keyword) 
    {})