2014-09-23 50 views
0

使用Spring RestTemplate調用客戶端休息調用,是否可以抑制這些調用? 例如最多10個併發呼叫。調節RestTemplate調用

RestTemplate本身似乎沒有提供這個本身,所以我不知道選項是什麼。

最好有一個通用的解決方案,例如,還可以抑制SOAP調用。

回答

0

From the docs

要創建RestTemplate的實例,你可以簡單地調用默認 無參數的構造函數。這將使用來自java.net包的標準Java類作爲底層實現來創建HTTP 請求。這可以通過指定 ClientHttpRequestFactory的實現來覆蓋。 Spring提供了使用Apache HttpComponents HttpClient創建請求的實現 HttpComponentsClientHttpRequestFactory。 HttpComponentsClientHttpRequestFactory使用org.apache.http.client.HttpClient的實例 進行配置,該實例可以依次通過憑證信息或連接池功能配置爲 。

我想看看配置RestTemplate使用HTTP組件和setMaxPerRoutesetMaxTotal玩。如果您的SOAP客戶端also happens to be using HTTP Components有可能在兩者之間共享共享HTTP組件設置。

另一種選擇是推出自己的。您可以創建一個Proxy,使用Semaphore來阻止,直到其他請求完成。這些方針的東西(注意,此代碼是完全未經測試,只是溝通的你會如何實現這一總體思路):如果你想要去與這種類型的方法

public class GenericCounterProxy implements InvocationHandler 
{ 
    private final Object target; 
    private final int maxConcurrent; 
    private final Semaphore sem; 

    GenericCounterProxy(Object target, int maxConcurrent) 
    { 
     this.target = target; 
     this.maxConcurrent = maxConcurrent; 
     this.sem = new Semaphore(maxConcurrent, true); 
    } 

    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
     try 
     { 
      // block until acquire succeeds 
      sem.acquire() 
      method.invoke(target, args); 
     } 
     finally 
     { 
      // release the Semaphore no matter what. 
      sem.release(); 
     } 
    } 

    public static <T> T proxy(T target, int maxConcurrent) 
    { 
     InvocationHandler handler = new GenericCounterProxy(target, maxConcurrent); 
     return (T) Proxy.newProxyInstance(
      target.getClass().getClassLoader(), 
      target.getClass().getInterfaces(), 
      handler); 
    } 
} 

  • 您可能應該細化代理獲取Semaphore的方法,因爲目標上的每個方法都不會受到限制(例如,getters用於設置)。
  • 您需要從RestTemplate更改爲RestOperations這是一個接口或更改代理機制以使用基於類的代理。
+0

謝謝約翰。我接受這個答案,因爲它給了我足夠的思考,並找到最適合我的情況的解決方案。 – 2014-09-25 06:42:38