2012-04-11 4 views
5

He escrito un código clojure simple que accede a la API de transmisión de Twitter. Mi código es esencialmente el mismo que el código de ejemplo se describe en los documentos twitter-API:Obteniendo "java.io.EOFException: error JSON" usando clojure 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*)) 

estoy siguiendo tweets sobre un usuario específico y el uso de oauth para la autenticación (no mostrado). Cuando ejecuto el método de inicio de filtrado y se abre una conexión con Twitter, todo funciona bien para un hechizo, pero si la transmisión permanece inactiva durante un tiempo (alrededor de 30 segundos), es decir, no hay tweets sobre este usuario en particular, produce el error siguiente:

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

I asumido desde el docs gorjeo que cuando se utiliza una conexión de transmisión, gorjeo mantiene el flujo abierto indefinidamente. Debo hacer algunas suposiciones incorrectas. Actualmente estoy buceando en el código de clojure twitter-api para ver qué está pasando, pero pensé que más ojos me ayudarían a resolver esto más rápidamente.

+0

Sería una buena idea abrir un problema en el rastreador de problemas github de twitter-api. A menos que el autor mosee en SO y vea esto, es poco probable que alguien sepa cómo solucionarlo. – Rayne

Respuesta

3

Tuve el mismo problema que tú. Como ha encontrado, la función de transmisión emite un mensaje vacío si no se han recibido datos en los últimos treinta segundos más o menos. Intentar leer esto como json provoca la excepción de EOF que ve.

No conozco ninguna forma de evitar estas llamadas. En mi caso, trabajé en torno al problema con un simple condicional que recae en un mapa vacío cuando no hay JSON para leer.

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