我正在开发一个项目,我需要对我的服务器进行HTTP URL调用,该服务器正在运行Restful Service,它将响应作为JSON String
返回。
以下是我使用未来和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
界面并使用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;
}
}
问题陈述:
正如您在上面所看到的,我使用RestTemplate
执行URL的默认方式,它不使用任何Http请求超时,这意味着它在内部使用-1
作为{ {1}}和read
超时。
现在我要做的是,我想在上面的代码中有效地使用connection
设置Http Request超时。而且我不确定我需要使用哪个类,我可以看到RestTemplate
和HttpComponentsClientHttpRequestFactory
所以不确定我需要使用哪个类?
上述代码的任何简单示例基础将帮助我更好地理解如何使用SimpleClientHttpRequestFactory
设置Http请求超时。
我的Http Request超时值是否应该小于未来的超时值?
RestTemplate
vs HttpComponentsClientHttpRequestFactory
。哪一个使用?答案 0 :(得分:10)
默认情况下,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;
}
}
答案 1 :(得分:0)
SimpleClientHttpRequestFactory 使用标准 JDK 的 HTTP 库,因此不支持 HttpMethod.PATCH
之类的方法。因此,现在使用 HttpComponentsClientHttpRequestFactory
比以后需要时更改要好。