¿Cómo debo escribir un URLFetch para evitar excepciones de tiempo de espera? Aplicación Gae/J + Facebook

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

Pregunta

La función es muy simple:

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

El problema es que ocasionalmente obtengo una excepción:

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

Lo que me gustaría hacer es a la función en algún bucle while () o similar, por lo que sigue intentándolo hasta que la respuesta esté allí. ¿Cuál crees que sería el mejor enfoque? ¿Me dirijo a la dirección correcta o sugerirías algo totalmente diferente? Aumentar el tiempo de espera a 10 segundos, como se sugirió en otras publicaciones, debería evitar la mayoría de los problemas, pero no erradicar el problema.

Gracias.


PS 1: la línea FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate(); es necesario para evitar otro 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?...

PD 2: Este no es un problema como en este hilo: GOOGLEAPEPPINE URLFETCHECH TIMEOUT Exception Porque estoy buscando los servidores de Facebook, no mi propio servidor. Ni es como "Tiempo de espera mientras busca" urlfetch gae/j Porque el problema no es un alimento muy grande, sino un servidor no respondido (especialmente lento al responder las solicitudes de los usuarios de la prueba)

¿Fue útil?

Solución

En primer lugar, aumente el tiempo de espera de urlfetch a 10 seconds, marcará una gran diferencia en el término de menos excepciones de tiempo de espera elevados.

Intentaría descargar los datos de Facebook del controlador web la primera vez y, en caso de excepción de tiempo de espera, movería la tarea a un Tarea.

Una vez en una tarea, si se plantea una excepción de tiempo de espera y la tarea falla, App Engine lo retira automáticamente, tratando de descargar el contenido de la URL hasta que tenga éxito.

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))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top