Cómo crear controladores de tareas

En esta página se explica cómo crear un controlador de tareas, el código que controla una tarea de aplicaciones en cola. Debes proporcionar un controlador de solicitud a fin de procesar la tarea. La asignación de una URL de solicitud al controlador correspondiente se declara en el web.xml de tu servicio, al igual que cualquier otro controlador de solicitud. Debido a que controlas cómo se asignan las solicitudes de tareas al controlador, puedes elegir cómo organizar los controladores de tareas. Si tu aplicación procesa muchos tipos de tareas diferentes, puedes agregar todos los controladores a un solo servicio, o puedes distribuirlos en múltiples servicios.

Cómo escribir un controlador de solicitud de tarea de aplicaciones en cola

En la cola, el servicio de la lista de tareas en cola crea un encabezado HTTP y lo envía a una instancia del servicio de trabajo especificado por el destino de la tarea. Las solicitudes de lista de tareas en cola se envían desde la dirección IP 0.1.0.2.

Tu controlador no tendrá que estar escrito en el mismo lenguaje en el que se creó y puso en cola la tarea si lo escribes en un servicio separado.

Sigue estos lineamientos cuando escribas tu controlador:

  • El código debe mostrar un código de estado HTTP dentro de un rango de 200 y 299 para que sea correcto. Cualquier otro código indicará que la tarea tuvo un error.

  • Las tareas de aplicaciones en cola tienen un plazo de finalización que depende del tipo de escalamiento del servicio que las ejecuta. Los servicios de ajuste de escala automático deben finalizar su tarea en un plazo de 10 minutos. Los servicios de ajuste de escala manual y básico pueden ejecutarse hasta por 24 horas. Si tu controlador no se adhiere al plazo, el servicio de la lista de tareas en cola entiende que la tarea tuvo un error y volverá a intentarlo.

    Cuando el tiempo de ejecución de una tarea se acerca a la fecha de finalización, App Engine aumenta DeadlineExceededException antes de que se alcance la fecha de finalización, para que puedas guardar tu trabajo o registrar cualquier progreso realizado.

  • El controlador debe ser idempotente. La API de la lista de tareas en cola de App Engine está diseñada para brindar una entrega de "al menos una vez"; es decir, si una tarea se agrega correctamente, App Engine la entregará al controlador al menos una vez. Ten en cuenta que en algunas circunstancias excepcionales, es posible la ejecución de varias tareas, por lo que tu código debe garantizar que la ejecución repetida no causará efectos secundarios dañinos.

La lista de tareas en cola utiliza el código HTTP en la respuesta del controlador a fin de determinar si la tarea tuvo éxito. La respuesta del controlador la ve únicamente el servicio de la lista de tareas en cola y solo para determinar si la tarea se realizó correctamente. La cola ignora todos los otros campos en la respuesta. Entonces, el servicio descarta la respuesta. La aplicación de origen nunca recibe ningún tipo de datos. Si una tarea falla, el servicio de la lista de tareas en cola reintenta la tarea; para ello, envía otra solicitud.

Los datos suministrados por el usuario pueden entregarse al controlador en la solicitud como una string de consulta o como una carga útil en el cuerpo de la solicitud. La inserción de datos del usuario se describe en Cómo crear tareas. Si la solicitud incluye datos, el controlador debe saber cómo se los agregó en la solicitud. El código exacto que utilizas para obtener los datos de la solicitud depende del marco de trabajo web particular que utilizas.

Si deseas poner a prueba un controlador de tareas, ingresa como administrador y visita la URL del controlador en tu navegador.

Cómo leer encabezados de solicitud

Una solicitud HTTP de tarea de aplicaciones en cola tiene encabezados especiales establecidos por App Engine que contienen información específica de la tarea que puede utilizar el controlador.

Si estos encabezados están presentes en una solicitud de usuario externo a tu aplicación, se eliminan y reemplazan. La única excepción es para solicitudes de administradores que hayan accedido a la aplicación y que tengan permitido establecer encabezados con fines de prueba. Por otro lado, los encabezados no se quitan cuando la aplicación se está ejecutando en el servidor de desarrollo.

Las solicitudes de la lista de tareas en cola siempre tendrán los siguientes encabezados:

Encabezado Descripción
X-AppEngine-QueueName El nombre de la cola (posiblemente, "predeterminado" para la lista de aplicaciones en cola predeterminada).
X-AppEngine-TaskName El nombre de la tarea, o un ID único generado por el sistema si no se especificó el nombre.
X-AppEngine-TaskRetryCount La cantidad de veces que se volvió a intentar esta tarea. Para el primer intento, este valor es igual a 0. Este número incluye los intentos en los que la tarea falló debido a la falta de instancias disponibles y que nunca llegaron a la fase de ejecución.
X-AppEngine-TaskExecutionCount La cantidad de veces que esta tarea falló previamente durante la fase de ejecución. Este número no incluye las fallas ocasionadas por la falta de instancias disponibles.
X-AppEngine-TaskETA El plazo de ejecución objetivo de la tarea, especificado en segundos desde el 1 de enero de 1970.

Si tu controlador de solicitudes encuentra alguno de los encabezados antes mencionados, podrá confiar que la solicitud es de la lista de tareas en cola.

Además, las solicitudes de la lista de tareas en cola pueden tener los siguientes encabezados:

Encabezado Descripción
X-AppEngine-TaskPreviousResponse El código de respuesta HTTP del reintento anterior.
X-AppEngine-TaskRetryReason La razón por la que se volvió a intentar la tarea.
X-AppEngine-FailFast Indica que una tarea que se está ejecutando falla inmediatamente si una instancia existente no está disponible.

Cómo asegurar las URL del controlador de tareas

Si una tarea lleva a cabo operaciones confidenciales (como modificar datos), te recomendamos asegurar la URL del controlador a fin de evitar que un usuario externo malicioso la llame directamente. Para evitar que los usuarios accedan a las URL de las tareas puedes restringir el acceso a los administradores de App Engine. App Engine emite las solicitudes de tareas y siempre pueden dirigirse a una URL restringida.

Puedes obtener más información sobre cómo restringir las URL en Seguridad y autenticación. Este es un ejemplo que podrías usar en web.xml para restringir todo lo que empiece con /tasks/ y hacerlo exclusivo de administrador:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>tasks</web-resource-name>
        <url-pattern>/tasks/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

Para obtener más información sobre el formato de web.xml, consulta la documentación de descriptor de implementación.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Java