如何在Apache HttpClient 4.5中设置默认超时时间?(流畅)

3
我正在Java控制台应用程序中使用Apache HttpClient 4.5(具有流畅接口)。我注意到它的默认超时值似乎是无限的,但我必须为发送的请求使用非无限超时值。而且,我希望对所有请求使用相同的超时值。
如何全局设置默认连接超时和套接字超时值,以便我不必在发送请求的代码的每个位置上都设置它们?(请记住我使用流畅接口)
示例: 现在,在我发送请求的代码的每个位置上,我都会做类似以下的事情:(简单示例)
HttpResponse response = Request.Get(url)
   .connectionTimeout(CONNECTION_TIMEOUT) // <- want to get rid of this
   .sessionTimeout(SESSION_TIMEOUT)       // <- and this
   .execute()
   .returnResponse();

我希望做的是在程序开始时设置默认值。例如:

,我希望只需一次设置即可永久保留。

SomeImaginaryConfigClass.setDefaultConnectionTimeout(CONNECTION_TIMEOUT);
SomeImaginaryConfigClass.setDefaultSessionTimeout(SESSION_TIMEOUT);

这样我只需发送这样的请求。
HttpResponse response = Request.Get(url).execute().returnResponse();

在不设置每个调用的超时参数的情况下。

我在网上看到了一些答案,但它们要么是针对旧版本的Apache HttpClient(即不起作用),要么讨论使用构建器或传递配置类或其他过于复杂的方法,超出了我的需求范围。我只想设置默认超时值,没有比这更好的东西。我应该在哪里做这个?


1
也许您可以通过扩展Request类并定义自定义超时来实现此目标。然后使用新类构建您的请求。 - Graciano
感谢您的评论,很抱歉让您久等了,这是个好主意。或者只需创建一个带有静态方法的类来执行get()、put()、post()等操作。虽然为了更改设置而不得不编写样板代码确实有些遗憾,但我可能最终会这样做 :) - DisplayName
1个回答

8

可以使用自定义的 Executor 来实现这一点。

RequestConfig requestConfig = RequestConfig.custom()
        .setConnectTimeout(5000)
        .setSocketTimeout(5000)
        .build();
SocketConfig socketConfig = SocketConfig.custom()
        .setSoTimeout(5000)
        .build();
CloseableHttpClient client = HttpClients.custom()
        .setDefaultRequestConfig(requestConfig)
        .setDefaultSocketConfig(socketConfig)
        .build();

Executor executor = Executor.newInstance(client);
executor.execute(Request.Get("http://thishost/")).returnResponse();
executor.execute(Request.Get("http://thathost/")).returnResponse();

谢谢,好主意!我会保持问题开放一段时间,以防有人知道如何在没有样板的情况下设置设置的简单方法。如果您知道没有办法更改全局设置,请随时将其添加到您的答案中,我会接受它。 - DisplayName
可能没有办法...HttpClient 可能是为完成更复杂的 Http 操作而设计,也许不是仅发送标准 Http 请求最方便的库 - 如果他们担心代码中的一个地方更改了另一个地方(或者,如果您正在使用使用 HttpClient 的库,则是库)所依赖的全局设置,这是有道理的。 - DisplayName
我相当确定没有更好(更简洁)的方法。HC流畅的API也相当古老,某些事情还没有完全深思熟虑。请随意在项目中提出JIRA,或者更好的是在GitHub上提交PR。 - ok2c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接