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

每隔一个使用阿帕奇 HTTP 客户端的请求失败

叶稳
2023-03-14

我正在尝试使用Apache HTTPClient 4.5.1来执行一些rest请求。不幸的是,每一秒的请求都会以“java.net.SocketTimeoutException:Read timed out”结尾(如果没有设置套接字超时,则永远挂起)。

我正在这样构建我的客户:

ConnectionSocketFactory sf = new PlainConnectionSocketFactory();

Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory> create()
    .register("http", sf)
    .build();

Lookup<AuthSchemeProvider> authProviders = RegistryBuilder.<AuthSchemeProvider> create()
    .register(AuthSchemes.BASIC, (AuthSchemeProvider) new BasicSchemeFactory())
    .build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);

CredentialsProvider cp = new BasicCredentialsProvider();
cp.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "pass"));

RequestConfig requestConfig = RequestConfig.custom()
    .setConnectTimeout(15000)
    .setConnectionRequestTimeout(15000)
    .setSocketTimeout(15000)
    .build();

this.client = HttpClients.custom()
    .setConnectionManager(cm)
    .setDefaultCredentialsProvider(cp)
    .setDefaultAuthSchemeRegistry(authProviders)
    .setDefaultRequestConfig(requestConfig)
    .build();

之后,我像这样执行我的请求(在同一个 Http 客户端实例上):

HttpDelete delete = new HttpDelete(uri);

HttpClientContext context = HttpClientContext.create();
CloseableHttpResponse response = this.client.execute(request, context);
try {
    int statusCode = response.getStatusLine().getStatusCode();
    return statusCode;
}
finally {
    response.close();
}

如果我开始为每个请求使用一个新的HttpClient实例,一切都很好。在服务器端,我运行了一个野蝇8(和9)。对于第二个请求,我甚至看不到一个请求传入,所以在我看来,客户端甚至没有尝试。

知道我错过了什么/做错了什么吗?

共有1个答案

柳宪
2023-03-14

感谢hotzst提示启用日志记录,我明白了:

服务器正在返回HTTP状态204(无内容),但仍发送了一些响应数据。HttpClient将这些响应数据作为NEXT请求的“响应中的垃圾”,这通过弄乱响应头来破坏它。将reservers响应代码更改为404可以解决我的问题。

 类似资料:
  • 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的。您可以查看 HTTP 协议 了解更多相关信息。 以下是来自于浏览器端的重要头信息,您可以在 Web 编程中频繁使用: 头信息 描述 Accept 这个头信息指定浏览器或其他客户端可以处理的 MIME 类型。值 image/png 或 image/jpeg 是最常

  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 我正在尝试向一个网站发送帖子请求。作为对POST请求的响应,我希望得到一些JSON数据。 使用Apache的HttpClient库,我可以毫无问题地做到这一点。响应数据是JSON,所以我只是解析它。 但是我不能在我的项目中使用HttpClient库。我需要能够用“just”HttpURLConnection做同样的事情。 但是HttpClient库有一些我无法理解的魔力。因为使用HttpURLCo

  • 我正在玩ApacheCamel,在从“琐碎的示例”阶段过渡到“但有这些恼人的细节”阶段时遇到了一些问题。至关重要的是,如何进入并显式修改endpoint。 在这种情况下,我需要为超文本传输协议客户端设置一个auth cookie。我有一个cookie存储对象,但不知道如何强制客户端使用它。我试过使用,但没有公开cookie存储,而且它似乎也没有被调用。 我现在的代码: 并由以下人员调用: 知道我如

  • 如何在基于网络的 HTTP 客户端中重试 HTTP 请求? 请考虑以下处理程序,如果收到 HTTP 响应代码 503,它将尝试在 1 秒后重试 HTTP 请求: 在本例中,当我写入通道时,管道中的其他处理程序会看到HttpObjects,但实际上不会再次执行HttpRequest——只接收到一个HttpResponse。 我认为在这种情况下我只是滥用了 Channel,我需要创建一个新的通道(表示

  • 我在Apache Storm拓扑上运行了一个性能测试,并注意到kinesis-spout中的“failed”计数非常高(几乎占了元组的1/3)。这个数值是多少?