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

ApacheHttpClient 4.4。1忽略请求超时

吴靖
2023-03-14

我的Java代码使用共享的ApacheHttpClient 4.4。1.我将每个POST请求级别上的连接超时、套接字超时和连接请求超时设置为100毫秒。它大部分时间都很好用。然而,在大量请求(压力测试)时,HttpClient忽略这些超时;请求可能需要20秒或更长时间。这是我的密码:

private HttpResponse execHttp(HttpRequestBase request, HttpClient client) {
    RequestConfig params = RequestConfig.custom()
               .setConnectTimeout(100)
               .setSocketTimeout(100)
               .setConnectionRequestTimeout(100)
               .build();
    // Set config
    request.setConfig(params);

    // Measure time
    long tStart = System.currentTimeMillis();
    // Execute Http request
    HttpResponse response = client.execute(request);

    // Calculate and print time
    long tDiff = System.currentTimeMillis() - tStart;
    logger.debug(String.format("HTTPCLIENT EXEC TIME:  FROM REQUEST %d / %d / %d MS  ACTUAL %d MS", 
                                    request.getConfig().getSocketTimeout(),
                                    request.getConfig().getConnectTimeout(),                                  
                                    request.getConfig().getConnectionRequestTimeout(),  
                                    tDiff));
    return response;
}

在某些情况下,我会得到如下日志记录:

2018-10-26 14:18:45496[my-thread-1]调试com。我的包裹。HttpTimeoutTest-HTTPCLIENT执行时间:从请求开始100/100/100毫秒实际20044毫秒

代码里有什么缺失吗?或者有任何解决方案如何使其始终应用超时?

共有1个答案

周辰沛
2023-03-14

您的代码中没有其他突出的内容。如果它是HttpClient的一个bug,那么您可以尝试使用最新版本,看看是否可以解决它。如果这是一个瓶颈,那么打开HttpClient的“上下文日志记录”可能会提供一些见解。

也就是说,套接字超时仅适用于数据包到达之间的时间。因此,如果您一直以非常慢的速度获取数据包,那么您的总请求时间很容易就会比超时时间高得多。如果发生这种情况,则需要生成一个异步任务,以在硬超时间隔中止请求。

 类似资料:
  • 很好的一天! 我的应用程序使用简单的http客户端-服务器通信,通过客户端的凌空库建立。首先,我启动一个授权请求: 之后,我请求列出与当前用户相关的设备列表。此时,我收到了来自响应标题的cookei。auth请求的完整标头响应输出: 缓存控制——没有存储,没有缓存,必须重新验证,后检查=0,预检查=0 在身份验证请求的onResponce回调中,我将Set Cookie值作为sessionId,并

  • 我试图爬过craiglist的论坛类别。组织机构(https://forums.craigslist.org/).我的蜘蛛: 我通过错误回调收到以下消息: [失败实例:Traceback:: /usr/local/lib/python2.7/site-packages/twisted/internet/defer.py: 455:回调 /usr/local/lib/python2.7/site-p

  • 如何*。1 Jacoco覆盖范围内的课程是否被忽略? 我的POM中有以下内容: 但是,我收到以下错误消息: [警告]违反了com类的规则。mypackage。MyClass。1: 线路覆盖率为0.00,但预计最小值为0.85 更新日期:19年12月 以下是文件夹结构中的内容:

  • 我在下面试过了 我以为我会得到0,3,6...但是,我得到了0,1,2,3...因为Flowable最初得到的是。

  • 问题内容: 我正在尝试为api 编写Web服务。因此,我编写了一个MyLogRecord类,该类继承自LogRecord。我用JAX- B注释对此类进行了注释,包括,因此它将忽略未注释的字段和属性。当我启动tomcat时,出现错误,并且其他类没有默认的构造函数,但是没有带注释的方法对Level类或任何其他类进行任何引用。这些由父类引用。 我的子类具有需要定义的所有内容。如何使JAX-B完全忽略父类

  • 我将WireMock作为独立进程启动: Java-jar wiremock-standalone-2 . 6 . 0 . jar-port 8080-v 还行。 当超文本传输协议请求内容后缀时 /api/profile/Favorite/WireMock必须返回存根响应。对所有其他请求必须通过WireMock忽略,并且必须转发到正式服。 我必须如何配置WireMock?