Как мне написать 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, потому что я m загружаю серверы facebook, а не свой собственный сервер. Также не похоже на время ожидания при получении URLFetch GAE/J, потому что проблема не в очень большой поток, но не отвечающий сервер (особенно медленный при ответе на запросы тестовых пользователей)


person Aleadam    schedule 19.03.2011    source источник
comment
относительно проблемы SSL с facebook, если вы столкнулись с этим в последней версии 1.4.2. загрузите SDK (вручную, а не с помощью eclipse), см. code.google.com/ p/googleappengine/issues/detail?id=4603   -  person maximbr    schedule 19.03.2011
comment
Я знал, что это ошибка версии 1.4.2, и использовал ее как обходной путь. Я не знал, что это уже решено. Спасибо за совет.   -  person Aleadam    schedule 19.03.2011


Ответы (1)


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

Я бы попытался загрузить данные facebook из веб-обработчика в первый раз и, в случае исключения TimeOut, переместил бы задачу в Очередь задач.

Попав в 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))
person systempuntoout    schedule 19.03.2011
comment
Гораздо более элегантное решение, чем цикл while(). Тогда я углублюсь в TaskQeue. Спасибо. - person Aleadam; 19.03.2011