繁体   English   中英

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

[英]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作为readconnection超时。

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

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

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

  • HttpComponentsClientHttpRequestFactorySimpleClientHttpRequestFactory 使用哪一种?
  • 我的 Http 请求超时值是否应该小于未来的超时值?

默认情况下 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM