Comment dois-je écrire un URLFetch pour éviter des exceptions de délai d'attente? app GAE / J + Facebook

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

Question

La fonction est très 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);
}

Le problème est que, parfois, je reçois une exception:

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

Ce que je voudrais faire est de la fonction dans une boucle ou similaire while () de sorte qu'il continue d'essayer jusqu'à ce que la réponse est là. Que pensez-vous serait la meilleure approche? Est-ce que je dirigeais vers la droite ou vous suggère quelque chose de totalement différent? L'augmentation du délai d'attente de 10 secondes comme cela a été suggéré dans certains autres postes devraient éviter la plupart des problèmes, mais pas éradiquer le problème.

Merci.


PS 1: La FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate(); ligne est nécessaire pour éviter un autre problème,

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: Ce n'est pas un problème comme dans ce fil: GoogleAppEngine urlfetch délai d'attente exception parce que je suis aller chercher la facebook serveurs, pas mon propre serveur. Ni est comme « délai d'attente lors de l'extraction » URLFetch GAE / J parce que la question est pas un très grand flux, mais un serveur non réactif (spécialement lent pour répondre des demandes par les utilisateurs de test)

Était-ce utile?

La solution

Tout d'abord, augmenter le délai de urlfetch à 10 seconds, cela fera une énorme différence en terme de moins soulevé des exceptions de délai.

Je voudrais essayer de télécharger les données facebook du gestionnaire Web la première fois et, en cas d'exception TimeOut, je propose la tâche à un TaskQueue .

Une fois dans un TaskQueue, si une exception TimeOut est soulevée et la tâche échoue, App Engine retente automatiquement, en essayant de télécharger le contenu de l'URL jusqu'à ce qu'il réussisse.

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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top