【问题标题】:How should I write an URLFetch to avoid timeout exceptions? GAE/J + Facebook app我应该如何编写 URLFetch 以避免超时异常? GAE/J + Facebook 应用程序
【发布时间】:2011-07-18 15:46:28
【问题描述】:

功能很简单:

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

【问题讨论】:

  • 关于 facebook 的 SSL 问题,如果这是您在最新的 1.4.2 中遇到的问题。下载SDK(手动不使用eclipse)见code.google.com/p/googleappengine/issues/detail?id=4603
  • 我知道这是 1.4.2 中的一个错误,我将其用作解决方法。我不知道它已经解决了。感谢您的提示。

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


【解决方案1】:

首先,将 urlfetch 超时增加到10 seconds,这将在减少引发的超时异常方面产生巨大的差异。

我会尝试第一次从 Web 处理程序下载 facebook 数据,如果出现 TimeOut 异常,我会将任务移动到 TaskQueue

一旦在 TaskQueue 中,如果引发 TimeOut 异常并且 Task 失败,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))

【讨论】:

  • 比 while() 循环更优雅的解决方案。然后我将深入研究 TaskQue。谢谢。
猜你喜欢
  • 2011-05-06
  • 2018-06-13
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多