我写了一些简单的clojure代码来访问twitter流API。我的代码与twitter-api docs中描述的示例代码基本相同:
(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文档中假设,当使用流式连接时,twitter会无限期地保持流的开放。我必须做出一些不正确的假设。我正在深入讨论clojure twitter-api代码,看看发生了什么,但我认为更多的眼睛会帮助我更快地解决这个问题。
答案 0 :(得分:3)
我遇到了同样的问题。如您所见,如果在最后30秒左右没有收到数据,则流功能会发出空消息。 尝试将其读作json然后会导致您看到的EOF异常。
我不知道有什么方法可以阻止这些电话。在我的情况下,我使用一个简单的条件解决了这个问题,当没有JSON要读取时,该条件会回到空映射。
(if-not (clojure.string/blank? %)
(json/read-str % :key-fn keyword)
{})