我正在开发一个项目,我需要对我的服务器进行HTTP URL调用,该服务器正在运行Restful Service,它将响应作为
JSON字符串返回.
下面是我使用未来和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 Request超时,因此这意味着它在内部使用-1作为读取和连接超时.
现在我要做的是,我想在上面的代码中有效地使用RestTemplate设置Http Request超时.而且我不确定我需要使用哪个类,我可以看到HttpComponentsClientHttpRequestFactory和SimpleClientHttpRequestFactory所以不确定我需要使用哪一个?
我上面的代码的任何简单的示例基础将帮助我更好地理解如何使用RestTemplate设置Http请求超时.
我的Http Request超时值是否应该小于未来的超时值?
> HttpComponentsClientHttpRequestFactory vs SimpleClientHttpRequestFactory.哪一个使用?
>我的Http Request超时值是否应该小于未来的超时值?
解决方法
默认情况下,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; } }