带有Aleph的Clojure TCP服务器

时间:2012-05-02 12:50:22

标签: tcp clojure netty

我正在尝试使用Aleph编写一个简单的TCP服务器。一切正常,但我不确定如何在通道关闭时检测到。

来自documentation

  

当客户端关闭连接时,通道的两侧将立即被密封。来自频道的最终消息将为nil

但是,我似乎永远不会收到最后的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,因为它感觉更加惯用。

1 个答案:

答案 0 :(得分:4)

  

要在关闭或耗尽通道时注册回调,请使用(on-closed ch callback)或(on-drained ch callback),它们都会使用零参数进行回调。

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