Domanda

La funzione è molto semplice:

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

Il problema è che occasionalmente ricevo un'eccezione:

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

Quello che vorrei fare è per la funzione in un po 'di ciclo () o simile, quindi continua a provare fino a quando la risposta è lì. Quale pensi sarebbe l'approccio migliore? Sto andando alla giusta direzione o suggeriresti qualcosa di totalmente diverso? L'aumento del timeout a 10 secondi, come è stato suggerito in alcuni altri posti, dovrebbe evitare la maggior parte dei problemi, ma non sradicare il problema.

Grazie.


PS 1: la linea FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate(); è necessario per evitare un altro problema,

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: questo non è un problema come in questo thread: GoogleAppengine Urlfetch Timeout Eccezione Perché sto recuperando i server di Facebook, non il mio server. Né è come "Timeout durante il recupero" urlfetch gae/j Perché il problema non è un feed molto grande, ma un server non reattivo (specialmente lento quando rispondono alle richieste degli utenti di prova)

È stato utile?

Soluzione

Prima di tutto, aumenta il timeout di Urlfetch a 10 seconds, farà un'enorme differenza nel termine di meno eccezioni di timeout sollevato.

Proverei a scaricare i dati di Facebook dal gestore web la prima volta e, in caso di eccezione timeout, sposterei l'attività in un Taskqueue.

Una volta in un taskQueue, se viene sollevata un'eccezione di timeout e l'attività non riesce, l'app Engine la ribalta automaticamente, cercando di scaricare il contenuto dell'URL fino al successo.

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))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top