写点什么

http client 中的 connectionRequestTimeout, connectTimeout, socketTimeout

用户头像
不在调上
关注
发布于: 2020 年 12 月 10 日

使用了很多年的httputil, 也聊了很多吃的超时设置,但是http 请求的几个超时参数设置依旧是非常模糊,现在让我一起来重新梳理一下connectionRequestTimeout, connectTimeout, socketTimeout



connectionRequestTimeout

官方注释如下

* Returns the timeout in milliseconds used when requesting a connection
* from the connection manager. A timeout value of zero is interpreted
* as an infinite timeout.
* <p/>
* A timeout value of zero is interpreted as an infinite timeout.
* A negative value is interpreted as undefined (system default).
* <p/>
* Default: <code>-1</code>

如果不设置就是使用-1, 使用系统默认的超时参数,那么具体在什么地方使用呢,先列出代码

final int timeout = config.getConnectionRequestTimeout();
managedConn = connRequest.get(timeout > 0 ? timeout : 0, TimeUnit.MILLISECONDS);

可以看到在使用连接请求的时候使用了connectionRequestTimeout 参数,对代码一直跟踪到

Date deadline = null;
if (timeout > 0) {
deadline = new Date (System.currentTimeMillis() + timeUnit.toMillis(timeout));
}
// 设置超时
if (deadline != null) {
success = this.condition.awaitUntil(deadline);
} else {
this.condition.await();
success = true;
}

那么什么时候释放呢

this.condition = this.lock.newCondition();
public boolean cancel(final boolean mayInterruptIfRunning) {
if (done.compareAndSet(false, true)) {
cancelled.set(true);
lock.lock();
try {
condition.signalAll();
} finally {
lock.unlock();
}
if (callback != null) {
callback.cancelled();
}
return true;
}
return false;
}
以及
public void release(final E entry, final boolean reusable) {
this.lock.lock();
try {
if (this.leased.remove(entry)) {
if (future != null) {
this.condition.signalAll();
}
}
} finally {
this.lock.unlock();
}
}



connectTimeout

一般就是指连接超时,用socket 展示如下

socket.connect(new InetSocketAddress("127.0.0.1", 8089), 1000);

那么看看http 是如何使用的

final int timeout = config.getConnectTimeout();
final int timeout = config.getConnectTimeout();

可以看出http 只是修改了原生超时的命名



socketTimeout

final int timeout = config.getSocketTimeout();
if (timeout >= 0) {
managedConn.setSocketTimeout(timeout);
}

最后设置

this.socket.setSoTimeout(timeout);



发布于: 2020 年 12 月 10 日阅读数: 16
用户头像

不在调上

关注

还未添加个人签名 2018.04.28 加入

还未添加个人简介

评论

发布
暂无评论
http client 中的 connectionRequestTimeout, connectTimeout, socketTimeout