2012-11-09 48 views
6

Tôi có đoạn mã sau:Clojure (aleph) phát hiện khi máy chủ ngắt kết nố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:" %))) 

Tất cả nó ngay bây giờ là kết nối đến một máy chủ địa phương và sau đó chuyển dữ liệu từ thiết bị xuất chuẩn thông qua các máy chủ. Điều này hoạt động tốt, ngoại trừ phần (on-closed socket #(println "closed")). Nếu tôi giết máy chủ trong khi khách hàng vẫn đang đi tôi sẽ nhận được một thông báo nói rằng "đóng cửa" để bàn giao tiếp, nhưng tôi không bao giờ làm.

Mục tiêu cuối cùng của tôi ở đây là tạo một số loại mã khôi phục, để nếu máy chủ không hoạt động, khách hàng sẽ xếp hàng thư trong khi chờ máy chủ quay trở lại và khi máy chủ quay lại ' sẽ kết nối lại và gửi mọi thứ đã được xếp hàng đợi.

Trả lời

7

Có vẻ như bạn đang chặn luồng sẽ thông báo cho bạn biết về việc đóng socket bằng vòng lặp (doseq ...) của bạn. Bọc nó trong một (future ...) và xem điều đó có khắc phục được không.

+1

Điều đó đã làm, cảm ơn bạn rất nhiều! (Ngoài ra, tôi cũng đang yêu thích aleph, cảm ơn bạn vì điều đó: P) –

Các vấn đề liên quan