Java 11 HttpClient间歇性挂起

问题描述

我正在使用Java 11的HttpClient。客户断断续续地挂起,我不知道为什么-我不知道是什么原因导致挂起,也不知道如何重现它。

构造客户端和请求的代码位于不同的位置,因此此摘要说明了它们的构造方式:

// excerpt 1: constructing the client
private HttpClient httpClient = HttpClient.newBuilder()
      .connectTimeout(Duration.ofSeconds(5))
      .build();

// excerpt 2: constructing the request
HttpRequest req = HttpRequest.newBuilder()
        .GET()
        .uri(...)
        .header(...)
        .header(...)
        .timeout(Duration.ofSeconds(5))
        .build();

// excerpt 3: sending the request
HttpResponse<String> resp = httpClient.send(req,BodyHandlers.ofString());

最初,我所知道的只是我的服务正在挂起-我不知道HttpClient参与其中。然后,我在后台线程中放置了一个看门狗计时器,该计时器持有对主工作线程的(弱)引用,这样,如果计时器到期,我就可以获得主工作线程正在执行的堆栈跟踪。那给了我这个堆栈跟踪(五分钟后过期):

j.u.c.TimeoutException: null // I crammed the thread's stack trace into an exception to play nice with Splunk
    at j.i.m.Unsafe.park(UnkNown Source)
    at j.u.c.l.LockSupport.park(UnkNown Source)
    at j.u.c.CompletableFuture$Signaller.block(UnkNown Source)
    at j.u.c.ForkJoinPool.managedBlock(UnkNown Source)
    at j.u.c.CompletableFuture.waitingGet(UnkNown Source)
    at j.u.c.CompletableFuture.get(UnkNown Source)
    at j.i.n.h.HttpClientImpl.send(UnkNown Source)
    at j.i.n.h.HttpClientFacade.send(UnkNown Source)
    at c.a.x.d.c.MyClientClass.sendRequest(MyClientClass.java:163)
    at ...

此后,我看到其中一些超时发生在所有使用HttpClient代码的不同部分中,都产生相同的堆栈跟踪。

我知道有HttpClient个可追溯到Java 9的错误可能导致挂起,但是我们正在上个月(IIRC)的Java 11版本上运行,并且我所阅读的所有错误均已修复。早于此。

关于可能引起此问题的任何建议,或者如何重现或进一步调试它的任何建议?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)