Ros*_*rei 50 java timeout apache-httpclient-4.x
有没有办法为整个执行指定超时HttpClient?
我尝试过以下方法:
httpClient.getParams().setParameter("http.socket.timeout", timeout * 1000);
httpClient.getParams().setParameter("http.connection.timeout", timeout * 1000);
httpClient.getParams().setParameter("http.connection-manager.timeout", new Long(timeout * 1000));
httpClient.getParams().setParameter("http.protocol.head-body-timeout", timeout * 1000);
Run Code Online (Sandbox Code Playgroud)
它实际上工作正常,除非远程主机发回数据 - 即使在一个字节/秒 - 它将继续永远读取!但我想在10秒内中断连接,无论主机是否响应.
Rea*_*Man 53
对于较新版本的httpclient(例如http组件4.3 - https://hc.apache.org/httpcomponents-client-4.3.x/index.html):
int CONNECTION_TIMEOUT_MS = timeoutSeconds * 1000; // Timeout in millis.
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(CONNECTION_TIMEOUT_MS)
.setConnectTimeout(CONNECTION_TIMEOUT_MS)
.setSocketTimeout(CONNECTION_TIMEOUT_MS)
.build();
HttpPost httpPost = new HttpPost(URL);
httpPost.setConfig(requestConfig);
Run Code Online (Sandbox Code Playgroud)
Fem*_*emi 32
目前无法设置该类型的最大请求持续时间:基本上您想说我不关心任何特定请求阶段是否超时,但整个请求的持续时间不得超过15秒(例如) .
最好的办法是运行一个单独的计时器,当它到期时,获取HttpClient实例使用的连接管理器并关闭连接,这应该终止链接.如果这对您有用,请告诉我.
Ros*_*rei 13
按照Femi的建议,工作正常.谢谢!
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
if(getMethod != null) {
getMethod.abort();
}
}
}, timeout * 1000);
Run Code Online (Sandbox Code Playgroud)
Val*_*kou 10
定时器是邪恶的!使用计时器或执行程序或任何其他机制为每个请求创建一个线程/可运行对象是一个非常糟糕的主意。请慎重考虑,不要这样做。否则,您将很快在或多或少的真实环境中遇到各种内存问题。想象一下 1000 req/min 意味着 1000 个线程或工人/分钟。可怜的GC。我提出的解决方案只需要 1 个看门狗线程,将节省您的资源时间和精力。基本上你做3个步骤。
您的缓存和看门狗线程可能如下所示。
import org.apache.http.client.methods.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.*;
public class RequestCache {
private static final long expireInMillis = 300000;
private static final Map<HttpUriRequest, Long> cache = new ConcurrentHashMap<>();
private static final ScheduledExecutorService exe = Executors.newScheduledThreadPool(1);
static {
// run clean up every N minutes
exe.schedule(RequestCache::cleanup, 1, TimeUnit.MINUTES);
}
public static void put(HttpUriRequest request) {
cache.put(request, System.currentTimeMillis()+expireInMillis);
}
public static void remove(HttpUriRequest request) {
cache.remove(request);
}
private static void cleanup() {
long now = System.currentTimeMillis();
// find expired requests
List<HttpUriRequest> expired = cache.entrySet().stream()
.filter(e -> e.getValue() > now)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// abort requests
expired.forEach(r -> {
if (!r.isAborted()) {
r.abort();
}
cache.remove(r);
});
}
}
Run Code Online (Sandbox Code Playgroud)
以及以下 sudo 代码如何使用缓存
import org.apache.http.client.methods.*;
public class RequestSample {
public void processRequest() {
HttpUriRequest req = null;
try {
req = createRequest();
RequestCache.put(req);
execute(req);
} finally {
RequestCache.remove(req);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57892 次 |
| 最近记录: |