使用clojure twitter-api获取"java.io.EOFException:JSON错误"

mof*_*eta 5 twitter clojure

我写了一些简单的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*))  
Run Code Online (Sandbox Code Playgroud)

我正在关注特定用户的推文并使用oauth进行身份验证(未显示).当我运行启动过滤方法并且使用Twitter打开连接时,一切都适用于一个咒语,但是如果该流是非活动状态(大约30秒),即没有关于该特定用户的推文正在下来,发生以下错误:

#<EOFException java.io.EOFException: JSON error (end-of-file)>
Run Code Online (Sandbox Code Playgroud)

我从twitter文档中假设,当使用流式连接时,twitter会无限期地保持流的开放.我必须做出一些不正确的假设.我正在深入讨论clojure twitter-api代码,看看发生了什么,但我认为更多的眼睛会帮助我更快地解决这个问题.

Dan*_*ood 3

我和你有同样的问题。正如您所发现的,如果在过去三十秒左右没有接收到数据,则流函数会发出一条空消息。尝试将其读取为 json 会导致您看到的 EOF 异常。

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

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