Jetty线程被阻塞并死锁

时间:2013-08-10 02:48:27

标签: clojure jetty embedded-jetty ring http-kit

我在我的服务器上使用jetty“7.6.8.v20121106”作为https://github.com/ring-clojure/ring/tree/master/ring-jetty-adapter的一部分。

我正在使用http://http-kit.org/拨打以下代码。基本上我正在进行服务器调用,但忽略了响应。我发现的是,之后所有服务器线程都被阻塞/死锁。这似乎是一种非常简单的方法,可以让服务器停机,并希望了解这里发生了什么。

来自客户的代码是:

(require '[org.httpkit.client :as hk-client])

 (defn hget [id]
   (hk-client/get (str "http://localhost:5000/v1/pubapis/auth/ping?ping=" id)))

(doall (map hget (take 100 (range))))) ; Gives problem
(doall (map deref (map hget (take 100 (range)))))) ; Doesn't give problem

Thread status 线程被阻止

sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118)

并在

处陷入僵局

java.io.PrintStream.write(PrintStream.java:479)

如果有人可以帮助解决这里发生的事情,我们将非常感激。

1 个答案:

答案 0 :(得分:1)

终于找到了问题所在。花了很多时间挖掘并开始一个示例项目来找到它。 当我开始学习clojure并从某个地方复制以下内容进行日志记录时:

(defn log [msg & vals]
  (let [line (apply format msg vals)]
    (locking System/out (println line))))

在某些情况下,那里的线路锁定导致死锁。对解决这个问题并不了解并发性。将为此创建一个单独的问题。

删除此行可解决问题。