Java okhttp客户端超时和apache超时之间的差异
过去我使用apache的http客户端。我有以下设置:Java okhttp客户端超时和apache超时之间的差异,java,spring-boot,okhttp,apache-httpcomponents,Java,Spring Boot,Okhttp,Apache Httpcomponents,过去我使用apache的http客户端。我有以下设置: 连接请求超时 连接超时 读取/套接字超时 连接池大小 我正在迁移到OkHttp客户端,它有不同的超时: 连接超时 呼叫超时 读取超时 写入超时 最大空闲连接数(连接池设置) 保持活动持续时间分钟数(连接池设置) 它们是如何相互映射的 问候, Rick摘自上一篇优秀的文章,下面是一些细节: 连接超时: 连接超时定义了客户机与目标主机建立连接的时间段。 默认情况下,对于OkHttpClient,此超时设置为10秒 但是,我们可以使用Ok
- 连接请求超时
- 连接超时
- 读取/套接字超时
- 连接池大小
- 连接超时
- 呼叫超时
- 读取超时
- 写入超时
- 最大空闲连接数(连接池设置)
- 保持活动持续时间分钟数(连接池设置)
Rick摘自上一篇优秀的文章,下面是一些细节:
OkHttpClient
,此超时设置为10秒
但是,我们可以使用OkHttpClient.Builder#connectTimeout
方法轻松更改其值。值为零表示根本没有超时
现在让我们看看如何构建和使用带有自定义连接超时的OkHttpClient
:
@Test
public void whenConnectTimeoutExceeded_thenSocketTimeoutException() {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.MILLISECONDS)
.build();
Request request = new Request.Builder()
.url("http://203.0.113.1") // non routable address
.build();
Throwable thrown = catchThrowable(() -> client.newCall(request).execute());
assertThat(thrown).isInstanceOf(SocketTimeoutException.class);
}
上面的示例显示,当连接尝试超过配置的超时时,客户端抛出一个SocketTimeoutException
OkHttpClient.Builder#callTimeout
方法配置自定义值
让我们看一个实际使用示例:
@Test
public void whenCallTimeoutExceeded_thenInterruptedIOException() {
OkHttpClient client = new OkHttpClient.Builder()
.callTimeout(1, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url("https://httpbin.org/delay/2")
.build();
Throwable thrown = catchThrowable(() -> client.newCall(request).execute());
assertThat(thrown).isInstanceOf(InterruptedIOException.class);
}
OkHttpClient.Builder\readTimeout
更改默认的10秒超时。与连接超时类似,零值表示没有超时
现在让我们看看如何在实践中配置自定义读取超时:
@Test
public void whenReadTimeoutExceeded_thenSocketTimeoutException() {
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(10, TimeUnit.MILLISECONDS)
.build();
Request request = new Request.Builder()
.url("https://httpbin.org/delay/2") // 2-second response time
.build();
Throwable thrown = catchThrowable(() -> client.newCall(request).execute());
assertThat(thrown).isInstanceOf(SocketTimeoutException.class);
}
正如我们所看到的,服务器没有在定义的500毫秒超时内返回响应。因此,OkHttpClient
抛出SocketTimeoutException
OkHttpClient.Builder#writeTimeout
覆盖默认值10秒。按照惯例,零值意味着根本没有超时
在以下示例中,我们将非常短的写入超时设置为10毫秒,并将1 MB的内容发布到服务器:
@Test
public void whenWriteTimeoutExceeded_thenSocketTimeoutException() {
OkHttpClient client = new OkHttpClient.Builder()
.writeTimeout(10, TimeUnit.MILLISECONDS)
.build();
Request request = new Request.Builder()
.url("https://httpbin.org/delay/2")
.post(RequestBody.create(MediaType.parse("text/plain"), create1MBString()))
.build();
Throwable thrown = catchThrowable(() -> client.newCall(request).execute());
assertThat(thrown).isInstanceOf(SocketTimeoutException.class);
}