我应该如何编写URLFetch以避免超时异常? GAE / J + Facebook应用程序

时间:2011-03-19 07:03:03

标签: java google-app-engine facebook-graph-api urlfetch

功能很简单:

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,因为问题不是一个非常大的Feed,而是一个无响应的服务器(在测试用户响应请求时速度特别慢)

1 个答案:

答案 0 :(得分:4)

首先,将urlfetch超时时间增加到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))