2012-05-02 22 views
4

我正在嘗試使用Aleph編寫一個簡單的TCP服務器。一切工作正常,除了我不確定我應該如何檢測通道何時關閉。與Aleph的Clojure TCP服務器

documentation

當客戶端關閉連接,該通道的兩側將被立即密封。來自頻道的最終消息將爲零

但是,我似乎沒有收到此最終的nil消息。如果我檢查頻道,我確實看到它已關閉。這裏是我的代碼:

(use 'lamina.core 'aleph.tcp 'gloss.core) 

(defn process-msg [ch msg] 
    (if (closed? ch) 
    (println "Channel has been closed") ;This never happens 
    (do-some-processing msg))) 

(start-tcp-server 
    (fn [ch client-info] 
    (receive-all ch 
     (partial process-msg ch)) 
    {:port 10000, :frame (string :utf-8 :delimiters ["\n"])}) 

我應該做一些不同的事情嗎?我的框架是否保持無消息處理?我可以有一個單獨的線程監視我的頻道並檢查它們是否已關閉,但這看起來像是一個糟糕的設計。我寧願使用Aleph,但現在它看起來像我將需要使用原始的Netty處理程序。直接使用Netty會很好,但如果可能的話,我寧願使用Aleph,因爲它感覺有點更習慣。

回答

4

要註冊的回調用於當一個信道被關閉或倒掉,用(上封閉通道的回調)或(上排水通道回調),其中兩個搭回調零個參數。

https://github.com/ztellman/lamina/wiki/Channels

+0

感謝。這正是我所期待的。我沒有想過檢查Lamina文檔。 – dbyrne