当前位置: 首页 > 知识库问答 >
问题:

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

闻华容
2023-03-14

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

  • 连接请求超时
  • 连接超时
  • 读取/套接字超时
  • 连接池大小
    null

共有1个答案

乐正意智
2023-03-14

摘自关于Baeldung的优秀文章,这里有几个细节:

>

  • 连接超时:

    connect timeout定义了一个时间段,客户端应在该时间段内与目标主机建立连接。默认情况下,对于OKHttpClient,此超时设置为10秒。

    @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);
    }
    

    我们来看一个实用的使用示例:

    @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);
    }
    

    在下面的示例中,我们设置了10 ms的非常短的写入超时,并将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);
    }
    

  •  类似资料:
    • 我正在使用Apache HTTP客户端联系外部服务。这项服务可能需要几个小时(如果不是更长的话)才能产生响应。我尝试了一些不同的方法,但要么以套接字结束,要么以读取超时结束。我刚刚尝试使用RequestConfig将套接字和连接超时设置为0,根据文档,这应该是无限的,但请求总是在1小时后返回。有什么想法吗?

    • 我有这部分代码: 有时可能需要10分钟才能收到服务器对请求的答复,这实际上是我试图通过上面的超时设置来防止的。 我在这里遗漏了什么,或者在这个设置旁边应该处理什么?

    • 我们已经定义了Lettuce客户端连接工厂,以便能够连接到定义自定义套接字和命令超时的Redis: 莴苣文档定义默认值: 默认套接字超时为10秒 默认命令超时为60秒 如果Redis服务中断,应用程序必须在300ms内接收超时。哪个值必须定义为最大值? Github示例项目:https://github.com/cristianprofile/spring-data-redis-lettuce

    • 问题内容: 我在ElastiCache上运行Redis集群。 多个进程连接到Redis集群。每个进程都位于Docker容器中。流程不尽相同-我有一个流程,一个流程等。 正常运行几天后,连接到Redis时,我的某些进程开始超时。当我进入受影响的容器并尝试通过到达群集时,与群集的连接超时。这告诉我,问题不仅影响过程,而且影响整个容器。 当我从任何其他容器中使用时,连接都不会出现问题。 我的进程会根据需

    • 在我的Spring Boot应用程序中,Hystrix与Feign一起工作。 我在使用: 如有任何帮助,不胜感激,谢谢!

    • 问题内容: 如何在Go HTTP客户端中使空闲超时? 空闲超时意味着从HTTP客户端内部调用Conn接口的Read / Write方法时发生超时。当客户端下载文件并且由于读取超时而导致下载失败时,此功能很有用。 问题答案: 您需要创建自己的,并返回,以设置适当的读写期限。 该会是这个样子: