2012-04-11 81 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) 
    {})