Как мне написать Urlfetch, чтобы избежать исключений тайм -аута? GAE/J + приложение Facebook
-
27-10-2019 - |
Вопрос
Функция очень проста:
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))