2012-04-11 11 views
5

Ho scritto qualche semplice codice clojure che accede al twitter streaming api. Mio codice è sostanzialmente lo stesso del codice di esempio descritto nei documenti twitter-api:Ottenere "java.io.EOFException: errore JSON" utilizzando il 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*)) 

Sto seguendo tweets su un utente specifico e utilizzando OAuth per l'autenticazione (non mostrato). Quando eseguo il metodo di filtro iniziale e una connessione viene aperta con twitter, tutto funziona bene per una magia, ma se il flusso è inattivo per un po '(circa 30 secondi), cioè nessun tweet su questo particolare utente sta scendendo dal luccio, verifica il seguente errore:

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

ho assunto dalla documentazione di Twitter che quando si utilizza una connessione in streaming, twitter mantiene il flusso aperto a tempo indeterminato. Devo fare alcune ipotesi errate. Attualmente mi sto immergendo nel codice clojure twitter-api per vedere cosa sta succedendo, ma ho pensato che più occhi mi avrebbero aiutato a capirlo più velocemente.

+0

Sarebbe una buona idea aprire un problema sul tracker di github di twitter-api. A meno che l'autore non si metta in SO e lo veda, è improbabile che qualcuno sappia come risolvere questo problema. – Rayne

risposta

3

Ho avuto lo stesso problema che hai. Come hai scoperto, la funzione di streaming emette un messaggio vuoto se non è stato ricevuto alcun dato negli ultimi trenta secondi. Cercando di leggere questo come json, quindi si provoca l'eccezione EOF che si vede.

Non conosco alcun modo per impedire queste chiamate. Nel mio caso ho risolto il problema con un semplice condizionale che ricade su una mappa vuota quando non c'è JSON da leggere.

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