2012-11-09 6 views
6

끊 때 검출 :Clojure의 (알레프) 서버 I는 다음과 같은 코드가

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

모두를 지금 로컬 서버에 연결하고 서버를 통해 표준 입력 데이터를 전달 않고있다. 이 부분은 (on-closed socket #(println "closed")) 부분을 제외하고는 정상적으로 작동합니다. 클라이언트가 계속 진행되는 동안 서버를 죽이면 콘솔에 "닫힌다"는 메시지가 표시됩니다.

나의 최종 목표는 일종의 복구 코드를 작성하는 것입니다. 따라서 서버가 다운되면 서버가 돌아올 때까지 기다리는 동안 클라이언트가 메시지를 대기열에 넣고 서버가 돌아올 때까지 기다리는 것이 좋습니다. 다시 연결하고 대기중인 모든 것을 보냅니다.

답변

7

(doseq ...) 루프로 닫는 소켓을 알리는 스레드를 차단하고있는 것 같습니다. (future ...)에 포장하고 문제가 해결되지 않는지 확인하십시오.

+1

그런가, 정말 고마워! (또한, 나는 지금까지 사랑에 빠진 알레프를 괴롭 히고있다. –

관련 문제