2012-11-09 6 views
6

Mam następujący kod:Clojure (alef) wykrywanie gdy serwer rozłącza

(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:" %))) 

wszystko, co robi teraz, to łączy się z serwerem lokalnym, a następnie przechodzi przez dane z stdin do serwera. Działa to dobrze, z wyjątkiem części (on-closed socket #(println "closed")). Jeśli zabiję serwer, gdy klient nadal będzie działał, powinienem otrzymać komunikat "zamknięty" do konsoli, ale nigdy tego nie robię.

Moim końcowym celem jest stworzenie kodu przywracania, aby po zaniku serwera klient ustawiał w kolejce wiadomości podczas oczekiwania na przywrócenie serwera, a gdy serwer wróci, " Połącz ponownie i wyślij wszystko, co było w kolejce.

Odpowiedz

7

Wygląda na to, że blokujesz wątek, który powiadamia Cię o zamknięciu gniazda za pomocą pętli (doseq ...). Owiń to w (future ...) i sprawdź, czy to nie rozwiąże problemu.

+1

To zrobiło, dziękuję bardzo! (Do tej pory też nienawidzę kochającego alefta, dziękuję ci również za to: P) –