2017-08-10 4 views
0

J'ai quelques threads en déplacement, chacun d'eux faisant un appel bloquant au kit HTTP. Mon code a fonctionné mais a récemment gelé après environ 30 minutes. Tous mes fils sont coincés au point suivant:Threads garés avec 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) 

ligne my_project.web.clj:35 est quelque chose comme:

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

(je suis en utilisant des fils de Java simples plutôt que core.async parce que je suis en cours d'exécution le contexte de un ensemble de clients Apache Kafka simultanés chacun dans leur propre thread.Le client Kafka fait tourner beaucoup de ses propres threads, d'autant plus que je l'exécute plusieurs fois, par exemple 5 en parallèle). Le fait que tous mes threads soient parqués comme cela dans HTTP Kit suggère une fuite de ressources, ou du code dans le kit HTTP qui meurt avant qu'il ait la chance de s'exécuter, ou peut-être la famine des ressources.

Un autre thread semble être bloqué ici. Il est possible que cela bloque toutes les livraisons de promesses.

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) 

Toutes les idées que le problème pourrait être, ou des pointeurs sur la façon de diagnostiquer?

Répondre

0

Une chose courante à faire est de mettre en place un DefaultUncaughtExceptionHandler. Cela vous donnera au moins une indication s'il y a des exceptions dans vos threads.

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

Stuart Sierra a écrit bien sur ce point: https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions

+0

Merci beaucoup. Malheureusement, cela ne fait pas la lumière sur le problème. – Joe