与http工具包一起驻留的线程

jw5wzhpr  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(407)

我有几个线程在运行中,每个线程都对httpkit进行阻塞调用。我的代码一直在工作,但最近在大约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 因为我运行的是一组并发的apachekafka客户机的上下文,每个客户机都在自己的线程中。kafka客户机确实启动了许多自己的线程,特别是当我运行它几次时(例如并行运行5次)。
事实上,我所有的线程都像这样停在http工具包中,这意味着资源泄漏,或者http工具包中的一些代码在有机会交付之前就死了,或者可能是资源匮乏。
另一根线好像卡在这里了。有可能是它阻止了所有的承诺。

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)

你知道问题是什么吗,或者是如何诊断的方法?

vi4fp9gy

vi4fp9gy1#

通常的做法是建立一个 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

相关问题