2011-09-21 26 views

Respuesta

13

Para utilizar diferido, primero hay que definir una clase que contiene el código que desea ejecutar:

class MyDeferred implements DeferredTask { 
    @Override 
    public void run() { 
     // Do something interesting 
    } 
}; 

Al igual que cualquier otra clase serializable, puede hacer que la gente que almacenar información relevante sobre la tarea. A continuación, para ejecutar la tarea, crear una instancia de la clase y pasarlo a la API de cola de tareas:

MyDeferred task = new MyDeferred(); 
// Set instance variables etc as you wish 
Queue queue = QueueFactory.getDefaultQueue(); 
queue.add(withPayload(task)); 

Incluso puede utilizar las clases internas anónimas para sus tareas, pero cuidado con las salvedades que se describen en la nota here .

+5

¿Se pueden agregar cosas como esta a la documentación por lo que es menos confuso? Me faltaba la parte donde agregué la tarea a la cola. La sección para DeferredTaskQueue en la documentación es solo un pequeño párrafo. Espero que esto ayude y ¡gracias por tomarse el tiempo de publicar esto! +1 :) – jmort253

+0

¿cuál es el método con Paylod? no lo puede encontrar en ninguna parte :( –

+1

'withPayload' es com.google.appengine.api.taskqueue.TaskOptions.Builder.withPayload (DeferredTask) –

1

La biblioteca diferida de Java aún no está en el SDK de GAE y es por eso que no puede encontrar ninguna documentación oficial. Esta solicitud de función se fija desde marzo de 2011 y ahora se puede usar la biblioteca diferida straight from the Sdk

Se puede usar la biblioteca diferida Vince Bonfanti que está disponible here.

El uso de la biblioteca es bastante simple y que está bien explicado en el documento:

1) El controlador de tarea diferida (servlet) necesita ser configurado dentro web.xml.
Tenga en cuenta que el init-param debe coincidir con el real url-pattern:

<servlet> 
    <servlet-name>Deferred</servlet-name> 
    <servlet-class>com.newatlanta.appengine.taskqueue.Deferred</servlet-class> 
     <init-param> 
      <param-name>url-pattern</param-name> 
      <param-value>/worker/deferred</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Deferred</servlet-name> 
     <url-pattern>/worker/deferred</url-pattern> 
    </servlet-mapping> 

2) La cola "diferido" necesita ser configurado dentro queue.xml (use cualquier tipo que desee)
Si utiliza el nombre de cola opcional en el método defer(), cree colas con los nombres apropiados.

<queue> 
     <name>deferred</name> 
     <rate>10/s</rate> 
    </queue> 

3) Crear una clase que implementa la com.newatlanta.appengine.taskqueue.Deferred.Deferrable interface;
el método doTask de esta clase es donde implementa su tarea lógica .

4) invocar el método Deferred.defer hacer cola a su tarea:

DeferredTask task = new DeferredTask(); // implements Deferrable 
    Deferred.defer(task); 

Si el tamaño de la tarea excede de 10 KB, las opciones de tareas se almacenan dentro de una entidad almacén de datos, que se elimina cuando la tarea se ejecuta.

Su método doTask puede lanzar una excepción PermanentTaskFailure para detener reintentos; cualquier otra excepción causa que la tarea se vuelva a intentar.

par de enlaces de bonificación:

  • Solicitud de funciones here.
  • Google groups thread here.
  • Github Fork
+0

Deferido [es] (http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/taskqueue/DeferredTask.html) parte del SDK de Java. –

+0

@Nick Gracias por señalar eso; Me he perdido totalmente el estado FIJO de la solicitud de función. Honestamente, no he leído ningún anuncio sobre esto, comenzando en el blog oficial de GAE. – systempuntoout