2012-11-09 9 views
6

Ho il codice seguente:Clojure (aleph) rilevare quando il server disconnette

(ns alephtest.core    
    (:use lamina.core aleph.tcp aleph.formats)) 

(defn connection-established [socket] 
    (println "Socket connection established") 
    (on-closed socket #(println "closed")) 
    (doseq [line (line-seq (java.io.BufferedReader. *in*))] 
     (enqueue socket line))) 

(defn -main [] 
    (on-realized (tcp-client {:host "localhost" :port 9000}) 
     connection-established 
     #(println "error:" %))) 

Tutto ciò fa adesso connects è un server locale e quindi passa i dati da stdin attraverso il server. Funziona bene, ad eccezione della porzione (on-closed socket #(println "closed")). Se uccido il server mentre il client sta ancora andando, dovrei ricevere un messaggio che dice "chiuso" alla console, ma non lo faccio mai.

Il mio obiettivo finale qui è quello di creare una sorta di codice di ripristino, in modo che se il server va giù il client accoderà i messaggi mentre attende che il server torni e quando il server ritorna ' Ricollegamento e invio di tutto ciò che è stato accodato.

risposta

7

Sembra che tu stia bloccando il thread che ti notifica la chiusura del socket con il tuo ciclo (doseq ...). Avvolgi quello in un (future ...) e vedi se questo non lo risolve.

+1

Sì, grazie mille! (Inoltre, fino ad ora sono pazzo di amare aleph, grazie anche per questo: P) –

Problemi correlati