[英]Connection Timeout in request with RestTemplate is not working correctly
[英]SimpleClientHttpRequestFactory vs HttpComponentsClientHttpRequestFactory for Http Request timeout with RestTemplate?
我正在開發一個項目,在該項目中我需要對運行 Restful Service 的服務器進行 HTTP URL 調用,該服務將響應作為JSON String
返回。
下面是我使用 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
接口並使用了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
作為read
和connection
超時。
現在我要做的是,我想在上面的代碼中使用RestTemplate
有效地設置 Http 請求超時。 而且我不確定我需要使用哪個類,我可以看到HttpComponentsClientHttpRequestFactory
和SimpleClientHttpRequestFactory
所以不確定我需要使用哪一個?
基於上述代碼的任何簡單示例都將幫助我更好地理解如何使用RestTemplate
設置 Http 請求超時。
而且我的 Http 請求超時值是否應該小於未來的超時值?
HttpComponentsClientHttpRequestFactory
與SimpleClientHttpRequestFactory
。 使用哪一種?默認情況下 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;
}
}
SimpleClientHttpRequestFactory 使用標准 JDK 的 HTTP 庫,因此不支持HttpMethod.PATCH
方法。 因此,現在最好使用HttpComponentsClientHttpRequestFactory
不是以后需要時更改它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.