【问题标题】:Jetty threads getting blocked and dead locked码头线程被阻塞和死锁
【发布时间】:2013-08-10 02:48:27
【问题描述】:

我在服务器上使用码头“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

线程阻塞在

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

并在

处陷入僵局

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

如果有人能帮助解决这里发生的事情,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    删除此行可以解决问题。

    【讨论】:

    • 这些行的阻塞表明您的客户端没有从套接字读取。服务器已进入阻塞连接上的线程阻塞(要写入的东西,没有读取的东西)。当您说“但忽略响应”时,我希望您阅读响应,或终止连接。
    • 此代码正在服务器上执行。中间件中的一行是调用日志。客户端发出一个 http 请求并忽略响应,这意味着根据github.com/http-kit/http-kit/issues/66#issuecomment-22441928,它将在客户端“收到响应,解码并丢弃,收集垃圾”。
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多