6

我编写了一些简单的 clojure 代码来访问 twitter 流 api。我的代码与 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 进行身份验证(未显示)。当我运行 start-filtering 方法并使用 twitter 打开连接时,一切正常,但如果流有一段时间不活动(大约 30 秒),即没有关于这个特定用户的推文出现,出现以下错误:

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

我从 twitter 文档中假设,当使用流连接时,twitter 会无限期地保持流打开。我一定是做了一些不正确的假设。我目前正在研究 clojure twitter-api 代码以查看发生了什么,但我认为更多的眼睛会帮助我更快地解决这个问题。

4

1 回答 1

3

我遇到了和你一样的问题。如您所见,如果在过去 30 秒左右没有收到任何数据,流式处理函数会发出一条空消息。尝试将其读取为 json 会导致您看到的 EOF 异常。

我不知道有什么办法可以阻止这些电话。就我而言,我使用一个简单的条件来解决这个问题,当没有 JSON 可供读取时,该条件会退回到一个空地图。

(if-not (clojure.string/blank? %)
   (json/read-str % :key-fn keyword)
   {})
于 2013-01-13T23:08:17.123 回答