gpt4 book ai didi

java - SimpleClientHttpRequestFactory 与 HttpComponentsClientHttpRequestFactory 的 Http 请求超时与 RestTemplate?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:26 27 4
gpt4 key购买 nike

我正在开发一个项目,我需要对运行 Restful 服务的服务器进行 HTTP URL 调用,该服务以 JSON 字符串 形式返回响应。

下面是我使用 future 和 callables 的主要代码:

public class TimeoutThreadExample {

private ExecutorService executor = Executors.newFixedThreadPool(10);
private RestTemplate restTemplate = new RestTemplate();

public String getData() {
Future<String> future = executor.submit(new Task(restTemplate));
String response = null;

try {
response = future.get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

return response;
}
}

下面是我的 Task 类,它实现了 Callable 接口(interface)并使用了 RestTemplate:

class Task implements Callable<String> {

private RestTemplate restTemplate;

public Task(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}

public String call() throws Exception {

String url = "some_url";
String response = restTemplate.getForObject(url, String.class);

return response;
}
}

问题陈述:

正如您在上面看到的,我使用默认方式执行 URL,使用 RestTemplate 不使用任何 Http 请求超时,因此这意味着它在内部使用 -1 作为 readconnection 超时。

现在我要做的是,我想在上面的代码中使用 RestTemplate 有效地设置 Http 请求超时。我不确定为此需要使用哪个类,我可以看到 HttpComponentsClientHttpRequestFactorySimpleClientHttpRequestFactory 所以不确定我需要使用哪个类?

基于我上述代码的任何简单示例都将帮助我更好地理解如何使用 RestTemplate 设置 Http 请求超时。

而且我的 Http 请求超时值是否应该小于 future 的超时值?

  • HttpComponentsClientHttpRequestFactorySimpleClientHttpRequestFactory。使用哪一个?
  • 我的 Http 请求超时值是否应该小于 future 的超时值?

最佳答案

默认情况下,RestTemplate 使用 SimpleClientHttpRequestFactory,这取决于 HttpURLConnection 的默认配置。

您可以使用以下属性配置它们:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec

如果你想使用 HttpComponentsClientHttpRequestFactory - 它有一个 SimpleClientHttpRequestFactory 没有的连接池配置。

使用 HttpComponentsClientHttpRequestFactory 的示例代码:

public class TimeoutThreadExample {

private ExecutorService executor = Executors.newFixedThreadPool(10);
private static final RestTemplate restTemplate = createRestTemplate();

private static RestTemplate createRestTemplate(){
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(READ_TIME_OUT);
requestFactory.setConnectTimeout(CONNECTION_TIME_OUT);
return new RestTemplate(requestFactory);
}

public String getData() {
Future<String> future = executor.submit(new Task(restTemplate));
String response = null;

try {
response = future.get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

return response;
}
}

关于java - SimpleClientHttpRequestFactory 与 HttpComponentsClientHttpRequestFactory 的 Http 请求超时与 RestTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com