Темы, припаркованные с помощью HTTP-Kit

У меня на ходу несколько потоков, каждый из которых выполняет блокирующий вызов HTTP Kit. Мой код работает, но недавно он замерз примерно через 30 минут. Все мои темы застряли в следующей точке:

    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)

Линия my_project.web.clj:35 это что-то вроде:

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

(Я использую простые потоки Java, а не core.async потому что я запускаю контекст набора одновременных клиентов Apache Kafka, каждый в своем собственном потоке. Kafka Client действительно раскручивает множество собственных потоков, тем более, что я запускаю его несколько раз, например, 5 параллельно).

Тот факт, что все мои потоки в конечном итоге припаркованы таким образом в HTTP Kit, указывает на утечку ресурсов, или некоторый код в 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)

Любые идеи, в чем может быть проблема, или указатели на то, как ее диагностировать?

1 ответ

Обычная вещь, которую нужно сделать, это настроить 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

Другие вопросы по тегам