2017-08-10 110 views
0

我有一些線程正在忙碌中,每個線程都會對HTTP Kit進行阻塞調用。我的代碼一直在工作,但最近約30分鐘後凍結。我的所有線程都停留在以下幾點:my_project.web.clj:35使用HTTP-Kit停放線程

sun.misc.Unsafe.park(Native Method) 
    java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) 
    java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997) 
    java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304) 
    java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231) 
    clojure.core$promise$reify__7005.deref(core.clj:6823) 
    clojure.core$deref.invokeStatic(core.clj:2228) 
    clojure.core$deref.invoke(core.clj:2214) 
    my_project.web$fetch.invokeStatic(web.clj:35) 

線是一樣的東西:

(let [result @(org.httpkit.client/get "http://example.com")] 

(我使用的是普通的Java線程,而不是core.async因爲我跑的情況下一組併發的Apache Kafka客戶端分別在它們自己的線程中,Kafka客戶端啓動了很多自己的線程,特別是當我運行它幾次時,例如5並行)。

事實上,我的所有線程最終停留在HTTP套件中,這表明資源泄漏或HTTP Kit中的某些代碼在它有機會交付之前死亡,或者可能資源匱乏。

另一個線程似乎卡在這裏。它可能會阻止所有承諾交付。

sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:850) 
sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781) 
javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) 
org.httpkit.client.HttpsRequest.unwrapRead(HttpsRequest.java:35) 
org.httpkit.client.HttpClient.doRead(HttpClient.java:131) 
org.httpkit.client.HttpClient.run(HttpClient.java:377) 
java.lang.Thread.run(Thread.java:748) 

任何想法可能是什麼問題,或指示如何診斷它?

回答

0

一個常見的事情是建立一個DefaultUncaughtExceptionHandler。 這至少會告訴您線程是否有例外。

(defn init-jvm-uncaught-exception-logging [] 
    (Thread/setDefaultUncaughtExceptionHandler 
    (reify Thread$UncaughtExceptionHandler 
     (uncaughtException [_ thread ex] 
     (log/error ex "Uncaught exception on" (.getName thread)))))) 

斯圖爾特塞拉利昂已經寫得很好這個:https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions

+0

非常感謝。不幸的是,這並沒有解決問題。 – Joe