2011-11-21 50 views
3

的HTTP客戶端公地4.12 tutorial section on exception handling清楚地表明,一個人應該能夠通過執行以下操作來設置請求重傳處理器...HttpClient的API爲setHttpRequestRetryHandler

httpclient.setHttpRequestRetryHandler(myRetryHandler);

在Eclipse我想,並報告HttpClient沒有這樣的方法。它建議我把客戶打到AbstractHttpClient然後打電話。 setHttpRequestRetryHandler像這樣:

((AbstractHttpClient) httpclient).setHttpRequestRetryHandler(myRetryHandler);

那麼我的代碼工作,但文檔和API之間的這種差異讓我不知道如果我做一些我不應該。

是文檔錯誤還是我?

回答

4

你完全正確。該文檔使用的具體DefaultHttpClient(這是AbstractHttpClient子類等具有setHttpRequestRetryHandler()方法。

當你正在做正確的事,編程到HttpClient接口(其中可悲的是不公開該方法),你有要做到這一點討厭的演員。

它看起來像Apache的團隊已經決定保留HttpClient接口超潔淨,在客戶端代碼的代價:-(

+2

的基本假設是一個使用一個具體的類,如'DefaultHttpClient'完全初始化客戶機,然後使用在應用程序代碼中的'HttpClient'接口參考。超級乾淨的'HttpClient'界面使通過界面裝飾提供更多功能更加容易。 HttpClient 4.2帶有幾個這樣的裝飾器:用於透明內容解碼,響應緩存和自動恢復。 – oleg

3

使用的HttpClient在這種情況下,正確的方法是使用AutoRetryHttpClient,它接受DefaultServiceUnavailableRetryStrategy。一個可能的原因,爲什麼thi經常被忽視的是AutoRetryHttpClient實現HttpClient接口而不是擴展AbstractHttpClient。在這種情況下不需要鑄造。

DefaultServiceUnavailableRetryStrategy retryStrategy = new DefaultServiceUnavailableRetryStrategy(5, 50); 
AutoRetryHttpClient   httpClient = new AutoRetryHttpClient(retryStrategy); 
+0

Thx!第二個參數是重試間隔。猜測它以毫秒爲單位。希望人們用單位命名他們的時間參數,比如'retryIntervalMillis'而不是簡單的'retryInterval'。 – arun

+1

這個答案有誤導性。在Apache HC中,「ServiceUnavailableRetryStrategy」和「HttpRequestRetryHandler」完全是兩碼事。一個用於重試接收錯誤的http響應代碼(這表示請求至少已成功傳遞);然而後者是對異常進行重試,這可能會導致管道損壞,連接重置等。 – mzhang