Как мне написать Urlfetch, чтобы избежать исключений тайм -аута? GAE/J + приложение Facebook

StackOverflow https://stackoverflow.com/questions/5360702

Вопрос

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

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...

Что я хотел бы сделать для функции в течение некоторого времени () цикл или аналогичного, поэтому он продолжает пытаться, пока ответ не будет. Как вы думаете, что будет лучшим подходом? Я направляюсь в правильное направление или вы бы предложили что -то совершенно другое? Увеличение тайм -аута до 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 исключение Потому что я получаю серверы Facebook, а не свой собственный сервер. Также не похоже «Тайм -аут во время получения» urlfetch gae/j Поскольку проблема не очень большая подача, а не реагирующий сервер (особенно медленно при ответе запросов тестовыми пользователями)

Это было полезно?

Решение

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

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

Оказавшись в TaskQueue, если исключение тайм -аута поднимается и выполняется задача, 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top