2013-08-10 6 views
1

Я использую причал «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

Наконец-то выяснилось, в чем проблема. Взял много копаний и начал с образца проекта, чтобы найти это. Когда я начал изучать Clojure и скопировал следующие где-то для регистрации:

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

Линия замок там причинял мертвую блокировку в какой-то ситуации. Не знаю достаточно о параллелизме, чтобы решить эту проблему. Будет создан отдельный вопрос для этого.

Удаление этой строки устраняет проблему.

+0

Блокировка на этих линиях указывает на то, что ваш клиент не считывает данные из сокета. Сервер вступил в этот поток, блокирующий перегруженное соединение (что-то писать, ничего не читает). Когда вы говорите «но игнорируя ответ», я надеюсь, что вы прочтете ответ или прекратите соединение. –

+0

Этот код выполняется на сервере. И строка в промежуточном программном обеспечении вызывает журнал. Клиент делает HTTP-запрос и игнорирует ответ, а это означает, что согласно https://github.com/http-kit/http-kit/issues/66#issuecom.2-22441928 он получит клиентский ответ, полученный, декодированный и выбросить, собрать мусор ». –