Как мне написать URLFetch, чтобы избежать исключений тайм-аута? Приложение GAE / J + Facebook - PullRequest
2 голосов
/ 19 марта 2011

Функция очень проста:

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: Это не проблема, как в этой теме: Исключение времени ожидания urlfetch GoogleAppEngine , потому что я получаю серверы facebook, а не свой собственный сервер. Также не похоже на «Время ожидания при получении» URLFetch GAE / J , поскольку проблема не в очень большом фиде, а в не отвечающем сервере (особенно медленном при ответе на запросы тестовых пользователей)

1 Ответ

4 голосов
/ 19 марта 2011

Прежде всего, увеличьте тайм-аут urlfetch до 10 seconds, это будет иметь огромное значение с точки зрения уменьшения числа исключений по тайм-ауту.

Я бы попытался загрузить данные 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))
...