2011-09-07 16 views
5

En una aplicación de Google App Engine que utiliza las siguientes líneas para leer una página de un sitio:¿Tiempo de espera de 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(); 

pero me dio el siguiente error:

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) 

Parece que tomó más tiempo de lo que le gustaría esperar, ¿qué puedo hacer si ese sitio es lento?

+0

Este es un tiempo de espera de solicitud, que ocurre después de 30 segundos. Como las solicitudes de URLFetch están limitadas a 10 segundos, debe hacer más que solo esta llamada. ¿Qué estás haciendo? –

+0

Sí, obtuve los contenidos de la página de 6 categorías y veo dónde se clasifica mi NMJava, por lo que tardó más tiempo en recorrer cada página para encontrar el nombre NMJava y calcula dónde se encuentra. – Frank

+1

¿Ha considerado usar URLFetch asincrónico? Eso te permitirá hacer todas las solicitudes en paralelo. –

Respuesta

3

A DeadlineExceededException se arroja cuando su código, el manejo de la solicitud a su aplicación web tarda más de 30 segundos en procesarse. Presumiblemente, su código tardará un tiempo en procesarse debido a la cantidad de tiempo que tuvo que esperar para recibir datos de otro sitio.

Puede crear una tarea en un task queue para recuperar y procesar esos datos, y cambiar el flujo de solicitud/respuesta web para responder con el progreso de su tarea.

+1

La excepción ser encontrado es un plazo de solicitud, no una fecha límite de URLFetch. –

+0

@Nick buen punto corregiré mi respuesta. –

+0

Woo, parece complicado, ¿algún código de muestra para hacer esto en el sitio de Google App Engine? Sería muy útil. – Frank

2

Si su código se ejecuta dentro de un controlador de solicitud, entonces de forma predeterminada hay un plazo de 60 segundos impuesto por App-Engine. No puedes cambiarlo Ver el "plazos" columna/hilera "escala automática" de la tabla en esta página bajo "tipos de escala":

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

Sin embargo, este código será capaz de correr durante algunas horas si cambia de módulo para usar "escalado manual" y una instancia "B1" - "B4". Ejemplo:

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> 

En este tipo de instancia, sus peticiones no será normalmente el tiempo de espera durante horas. (La documentación afirma que el plazo es "indefinido").