Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java okhttp客户端超时和apache超时之间的差异_Java_Spring Boot_Okhttp_Apache Httpcomponents - Fatal编程技术网

Java okhttp客户端超时和apache超时之间的差异

Java okhttp客户端超时和apache超时之间的差异,java,spring-boot,okhttp,apache-httpcomponents,Java,Spring Boot,Okhttp,Apache Httpcomponents,过去我使用apache的http客户端。我有以下设置: 连接请求超时 连接超时 读取/套接字超时 连接池大小 我正在迁移到OkHttp客户端,它有不同的超时: 连接超时 呼叫超时 读取超时 写入超时 最大空闲连接数(连接池设置) 保持活动持续时间分钟数(连接池设置) 它们是如何相互映射的 问候, Rick摘自上一篇优秀的文章,下面是一些细节: 连接超时: 连接超时定义了客户机与目标主机建立连接的时间段。 默认情况下,对于OkHttpClient,此超时设置为10秒 但是,我们可以使用Ok

过去我使用apache的http客户端。我有以下设置:

  • 连接请求超时
  • 连接超时
  • 读取/套接字超时
  • 连接池大小
我正在迁移到OkHttp客户端,它有不同的超时:

  • 连接超时
  • 呼叫超时
  • 读取超时
  • 写入超时
  • 最大空闲连接数(连接池设置)
  • 保持活动持续时间分钟数(连接池设置)
它们是如何相互映射的

问候,


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

  • 呼叫超时:

    调用超时与我们已经讨论过的连接、读取和写入超时稍有不同它定义了完整HTTP调用的时间限制。这包括解析DNS、连接、写入请求正文、服务器处理以及读取响应正文。与其他超时不同,它的默认值设置为零,这意味着没有超时。当然,我们可以使用
    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);
    }