Wie soll ich eine URLFetch schreiben, um Zeitüberschreitungsausnahmen zu vermeiden? GAE/J + Facebook App

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

Frage

Die Funktion ist sehr einfach:

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);
}

Das Problem ist, dass ich gelegentlich eine Ausnahme bekomme:

java.lang.RuntimeException: java.io.IOException: Timeout while fetching: https://graph.facebook.com...

Was ich gerne tun möchte, ist die Funktion in einigen Zeit () Schleife oder ähnlich, so dass es immer wieder versucht, bis die Antwort vorhanden ist. Was ist Ihrer Meinung nach der beste Ansatz? Gehe ich in die richtige Richtung oder würden Sie etwas völlig anderes vorschlagen? Das Erhöhen der Auszeit auf 10 Sekunden, wie in einigen anderen Stellen vorgeschlagen wurde, sollte die Mehrheit der Probleme vermeiden, das Problem jedoch nicht ausrotten.

Vielen Dank.


PS 1: Die Linie FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate(); ist erforderlich, um ein anderes Problem zu vermeiden,

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: Dies ist kein Problem wie in diesem Thread: GoogleLeAbengine UrlFetch Timeout -Ausnahme Weil ich die Facebook -Server abreibe, nicht meinen eigenen Server. Auch ist es auch nicht wie "Timeout beim Abrufen" urlfetch gae/j Da das Problem kein sehr großer Feed ist, sondern ein nicht reagierender Server (besonders langsam, wenn die Anforderungen von Testbenutzern reagiert)

War es hilfreich?

Lösung

Erhöhen Sie zunächst die Urlafetch -Zeitüberschreitung auf 10 seconds, Es wird einen großen Unterschied in der Laufzeit von weniger erhöhten Zeitüberschreitungsausnahmen bewirken.

Ich würde versuchen, die Facebook -Daten zum ersten Mal vom Web -Handler herunterzuladen, und im Falle einer Ausnahme von Zeitüberschreitungen würde ich die Aufgabe zu einem verschieben TaskQueue.

Wenn in einem TaskQueue eine Ausnahme aus dem Timeout erhöht und die Aufgabe fehlschlägt, wird die App -Engine automatisch überholt und versucht, den Inhalt der URL herunterzuladen, bis sie erfolgreich ist.

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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top