gpt4 book ai didi

java - AsyncHttpClient 和超时

转载 作者:行者123 更新时间:2023-11-30 09:29:32 36 4
gpt4 key购买 nike

在AsyncHttpClient JDKFuture.get()中

 public V  [More ...] get(long timeout, TimeUnit unit)  {
V content = null;
try {
if (innerFuture != null) {
content = innerFuture.get(timeout, unit);
}
} catch (TimeoutException t) {
if (!contentProcessed.get() && timeout != -1 &&
((System.currentTimeMillis() - touch.get()) <= responseTimeoutInMs)) {
return get(timeout, unit);
}

为什么我们有 2 次超时?

  1. timeout as param
2. responseTimeoutInMs

第二次超时对我们造成了伤害,因为即使超时后调用也不会发出。它不断递归地再次调用 get() 。

一旦 responseTimeoutInMs 命中,连接会关闭吗?我们正在尝试将其设置为低于超时时间。

最佳答案

我假设你指的是我在网上找到的方法:

public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
V content = null;
try {
if (innerFuture != null) {
content = innerFuture.get(timeout, unit);
}
} catch (TimeoutException t) {
if (!contentProcessed.get() && timeout != -1 && ((System.currentTimeMillis() - touch.get()) <= responseTimeoutInMs)) {
return get(timeout, unit);
}

if (exception.get() == null) {
timedOut.set(true);
throw new ExecutionException(new TimeoutException(String.format("No response received after %s", responseTimeoutInMs)));
}
} catch (CancellationException ce) {
}

if (exception.get() != null) {
throw new ExecutionException(exception.get());
}
return content;
}

你可以认为这个类在几个方面是错误的。第一个直接跳入眼睛的错误是使用 System.currentTimeMillis() 而不是 System.nanoTime()System.currentTimeMillis() 指的是计算机系统时钟,在程序执行过程中可以调整,因此可以来回跳转。处理超时的代码应该使用 System.nanoTime(),它给出了一个相对于独立于现实世界时钟的程序执行的值。

responseTimeoutInMs 似乎意味着连接超时,但即使在作为参数值传递的 timeout 已过期时使用它也违反了 Future 契约(Contract)。正确的行为是让 get 方法超时,即使 Future 表示的任务可能仍在运行。

但是递归调用get 方法是双重错误。递归不仅很危险,因为较小的超时值可能会导致 StackOverflowError;再次将相同的 timeout 传递给自身意味着无限延迟超时,因为每次重新调用都会将该值视为相对于当前时间。

有趣的是,即使该方法到达超时点,它也会将 TimeoutException 包装在 ExecutionException 中,向调用者报告完全错误的语义。

我不相信你会在 stackoverflow 上找到可以解释这个实现背后的基本原理的人,如果有的话。您将不得不直接询问该代码的支持者/作者。

关于java - AsyncHttpClient 和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623995/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com