2011-03-19 45 views
2

的功能很簡單:如何編寫URLFetch以避免超時異常? GAE/J + Facebook應用程序

public static String readURL(URL url, HTTPMethod method) throws IOException { 
    FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate(); 
    HTTPRequest request = new HTTPRequest (url, method, opt); 
    URLFetchService service = URLFetchServiceFactory.getURLFetchService(); 
    HTTPResponse response = service.fetch(request); 
    byte[] content = response.getContent(); 
    return new String(content); 
} 

的問題是,有時我得到一個異常:

java.lang.RuntimeException: java.io.IOException: Timeout while fetching: https://graph.facebook.com... 

我想這樣做是爲了在功能一些while()循環或類似的,所以它一直在嘗試,直到響應在那裏。你認爲最好的方法是什麼?我是否正朝着正確的方向前進?還是你會建議完全不同的東西?正如其他一些職位所建議的那樣,將超時時間增加到10秒應該可以避免大部分問題,但不能根除問題。

謝謝。


PS 1: 線FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate();是需要避免的另一個問題,

HTTP ERROR 500 
Problem accessing /auth. Reason: 
javax.net.ssl.SSLHandshakeException: Could not verify SSL certificate for: https://graph.facebook.com/oauth/access_token?... 

PS 2: 這不是像在這個線程的問題:GoogleAppEngine urlfetch timeout exception因爲我獲取了Facebook服務器,不是我自己的服務器。也不是像"Timeout while fetching" URLFetch GAE/J,因爲這個問題是不是一個非常大的飼料,而是一個無響應的服務器(特別是響應緩慢的通過測試用戶請求時)

+1

關於Facebook的SSL問題,如果它是你在最新的1.4.2中打的東西。下載SDK(手動不使用eclipse)請參閱http://code.google.com/p/googleappengine/issues/detail?id=4603 – maximbr 2011-03-19 16:49:06

+0

我知道這是1.4.2中的一個錯誤,我正在使用它作爲解決方法。我不知道它已經解決了。謝謝你的提示。 – Aleadam 2011-03-19 17:21:38

回答

3

首先,增加了網址抓取超時10 seconds,就會使一個巨大的增加超時例外情況的差異。

我會嘗試第一次從Web處理程序下載Facebook數據,如果發生TimeOut異常,我會將任務移至TaskQueue

一旦進入TaskQueue,如果引發TimeOut異常並且任務失敗,App Engine會自動重試它,嘗試下載Url的內容直到成功。

import com.google.appengine.api.taskqueue.Queue; 
import com.google.appengine.api.taskqueue.QueueFactory; 
import static com.google.appengine.api.taskqueue.TaskOptions.Builder.*; 

     Queue downloadqueue = QueueFactory.getDefaultQueue(); 
     queue.add(withUrl("/worker").param("url", urlToFetch)) 
+1

比while()循環更優雅的解決方案。那麼我會深入研究TaskQeue。謝謝。 – Aleadam 2011-03-19 17:20:28

相關問題