2011-09-07 24 views
5

In un'applicazione Google App Engine ho usato le seguenti linee di leggere una pagina da un sito:Timeout di Google App Engine?

String Url="http://...",line,Result=""; 

    URL url=new URL(Url+"?r="+System.currentTimeMillis()); 
    BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream())); 

    while ((line=reader.readLine())!=null) { Result+=line+"\n"; } 
    reader.close(); 

ma ho ottenuto il seguente errore:

Uncaught exception from servlet 
com.google.apphosting.api.DeadlineExceededException: This request (f5e2889605d27d42) started at 2011/09/07 03:20:41.458 UTC and was still executing at 2011/09/07 03:21:30.888 UTC. 
    at sun.misc.Unsafe.park(Native Method) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1326) 
    at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:276) 
    at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:82) 
    at com.google.appengine.tools.development.TimedFuture.get(TimedFuture.java:55) 
    at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:69) 
    at com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:177) 
    at com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:56) 
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:150) 
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:148) 
    at java.security.AccessController.doPrivileged(Native Method) 

Sembra ci sono voluti più di quanto non vorrebbe aspettare, cosa posso fare se quel sito è lento?

+0

Questo è un timeout della richiesta, che si verifica dopo 30 secondi. Poiché le richieste URLFetch sono limitate a 10 secondi, devi fare molto più di una sola chiamata. Cosa fai? –

+0

Sì, stavo ottenendo il contenuto della pagina da 6 categorie e ho visto dove è classificata la mia NMJava, quindi ci sono voluti più tempo mentre passa attraverso ogni pagina per trovare il nome NMJava e calcola dove si trova sopra tutto. – Frank

+1

Hai considerato l'utilizzo di URLFetch asincrono? Questo ti permetterà di fare tutte le richieste in parallelo. –

risposta

3

Viene generato un numero DeadlineExceededException quando il codice, gestendo la richiesta per l'applicazione Web, richiede più di 30 secondi per l'elaborazione. Presumibilmente, il tuo codice impiega un po 'di tempo per essere elaborato a causa del tempo necessario per ricevere i dati da un altro sito.

È possibile creare un'attività su un task queue per recuperare ed elaborare tali dati e modificare il flusso di richiesta/risposta Web per rispondere con lo stato di avanzamento dell'attività.

+1

L'eccezione essere incontrati è una scadenza richiesta, non una scadenza URLFetch. –

+0

@Nessun buon punto, correggerò la mia risposta. –

+0

Woo, sembra complicato, qualsiasi codice di esempio per farlo sul sito di Google App Engine? Sarebbe molto utile. – Frank

2

Se il codice è in esecuzione all'interno di un gestore richieste, per impostazione predefinita è applicata una scadenza di 60 secondi applicata a App-Engine. Non puoi cambiarlo Vedere la colonna "Scadenze" riga/"scala automatica" del grafico di questa pagina sotto "Tipi di valore":

https://developers.google.com/appengine/docs/java/modules/

Tuttavia, questo codice sarà in grado di funzionare per qualche ora se si cambia il modulo usare "ridimensionamento manuale" e un'istanza "B1" - "B4". Esempio:

default/src/main/webapp/WEB-INF/AppEngine-web.xml:

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application>myapp</application> 
    <module>default</module> 
    <version>1</version> 
    <threadsafe>true</threadsafe> 

    <instance-class>B1</instance-class> 
    <manual-scaling> 
    <instances>1</instances> 
    </manual-scaling> 
</appengine-web-app> 

Su questo tipo di esempio, le richieste in genere non timeout per ore. (La documentazione afferma che la scadenza è "indefinita".)