2014-09-06 1131 views
3

我正在開發一個項目,在該項目中,我需要對運行Restful Service的服務器進行HTTP URL調用,該服務以JSON String的形式返回響應。SimpleClientHttpRequestFactory與HttpComponentsClientHttpRequestFactory的Http請求超時RestTemplate?

下面是一個使用未來和可調用我的主要代碼:

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; 
    } 
} 

問題陳述:

正如你在上面看到的,我我使用默認的方式執行URL使用RestTemplate它不使用任何Http請求超時,這意味着它在內部使用-1作爲readconnection超時。

現在我想要做的是,我想在上面的代碼中有效地使用RestTemplate來設置Http請求超時。而且我不確定我需要使用哪一類,我可以看到HttpComponentsClientHttpRequestFactorySimpleClientHttpRequestFactory,因此不確定我需要使用哪一類?

我上面的代碼的任何簡單的示例基礎將幫助我更好地瞭解如何使用RestTemplate設置Http請求超時。

而且我的Http Request超時值是否應該小於未來的超時值?

  • HttpComponentsClientHttpRequestFactory vs SimpleClientHttpRequestFactory。哪一個使用?
  • 我的Http Request超時值是否應該小於將來的超時值?

回答

7

默認情況下,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; 
    } 
} 
+0

感謝您的建議。你有什麼機會知道我們應該使用哪一個?或者我們可以使用這兩種中的任何一種?而且我如何有效地在我的上述代碼庫中使用'requestFactory'?我從你的例子中明白瞭如何使用它,但是我在上面的代碼庫中將'requestFactory'放在哪裏,因爲我使用DI來傳遞RestTemplate。 – AKIWEB 2014-09-07 01:34:25

+0

這取決於你,但親自在我們使用HttpComponentsClientHttpRequestFactory的大型項目中。但我想這兩種方法都不應該有任何問題。使用'HttpComponentsClientHttpRequestFactory',您可以使用您自己的'HttpClient'配置更多選項。 爲了在您的代碼庫中使用,只需傳遞'HttpComponentsClientHttpRequestFactory'實例,就像我在我的回答末尾寫的代碼 – 2014-09-07 02:02:54

+0

當然,我正在考慮使用'HttpComponentsClientHttpRequestFactory'。我不明白你想讓我通過哪個實例?如果您可以在我的代碼庫上提供示例基礎,那麼我會更好地理解您的意思是什麼? – AKIWEB 2014-09-07 02:10:32