2017-08-10 1 views
0

Ich habe ein paar Threads unterwegs, von denen jeder einen blockierenden Aufruf an HTTP Kit macht. Mein Code hat funktioniert, aber nach etwa 30 Minuten ist er erstarrt. Alle meine Threads werden an folgenden Stelle stecken:Threads geparkt mit 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) 

Linie my_project.web.clj:35 ist so etwas wie:

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

(I Ebene Java-Threads bin mit nicht core.async, weil ich den Kontext renne eine Reihe von gleichzeitigen Apache Kafka Clients in einem eigenen Thread, der Kafka Client macht viele seiner eigenen Threads hoch, besonders wenn ich ihn einige Male aktiviere, zB 5 parallel.

Die Tatsache, dass alle meine Threads im HTTP Kit so geparkt sind, deutet auf ein Ressourcenleck hin, oder Code in HTTP Kit stirbt, bevor es eine Chance hat zu liefern, oder vielleicht Ressourcenmangel.

Ein anderer Thread scheint hier stecken zu bleiben. Es ist möglich, dass es alle Versprechenslieferungen blockiert.

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) 

Irgendwelche Ideen, was das Problem sein könnte, oder Hinweise, wie es zu diagnostizieren?

Antwort

0

Es ist üblich, eine DefaultUncaughtExceptionHandler einzurichten. Dies gibt Ihnen zumindest einen Hinweis, ob es Ausnahmen in Ihren Threads gibt.

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

Stuart Sierra hat schön auf diese geschrieben: https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions

+0

Dank sehr viel. Leider wirft das kein Licht auf das Problem. – Joe