簡體   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