2011-03-19 75 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