Migra listas de aplicaciones en cola a Cloud Tasks

En esta página, se describe cómo migrar el código de la lista de aplicaciones en cola de la lista de tareas en cola a Cloud Tasks. En este momento, Cloud Tasks se prefiere para trabajar con las listas de aplicaciones en cola de App Engine.

Descripción general

Con Cloud Tasks, puedes acceder al mismo servicio al que accedes con la API de RPC de las listas de tareas en cola. Esto significa que no necesitas volver a crear tus listas y tareas de aplicaciones en cola existentes. Sin embargo, debes migrar el código que crea las listas o tareas de aplicaciones en cola o que interactúa con ellas para usar la API de Cloud Tasks.

Puedes crear las listas y tareas de aplicaciones en cola o interactuar con ellas mediante las API de REST y de RPC de Cloud Tasks, la biblioteca cliente de Cloud Tasks para Java, la CLI de Google Cloud y Google Cloud Console. En esta página, se proporcionan ejemplos del uso de la CLI de gcloud y la biblioteca cliente de Cloud Tasks para Java.

En Cloud Tasks, todas las colas funcionan como listas de aplicaciones en cola. En el resto de esta guía y en la documentación de Cloud Tasks, el término cola es equivalente al término lista de aplicaciones en cola. Del mismo modo, el término tarea es equivalente al término tarea de aplicaciones en cola.

Funciones que por el momento no están disponibles en Cloud Tasks

Por el momento, las siguientes funciones no están disponibles en Cloud Tasks:

  • Agregar tareas en cola en las transacciones de Datastore
  • Usar la biblioteca de tarea diferida en lugar de un servicio de trabajador
  • Trabajar con tareas en aplicaciones multiusuario
  • Simular con el servidor de desarrollo local
  • Agregar tareas de manera asíncrona

Precios y cuotas

Migrar las listas de aplicaciones en cola a Cloud Tasks puede afectar los precios y las cuotas de tu app.

Precios

Cloud Tasks tiene sus propios precios. Al igual que con las listas de tareas en cola, enviar solicitudes a la app de App Engine con una tarea puede generar costos.

Cuotas

Las cuotas de Cloud Tasks son diferentes de las cuotas de las listas de tareas en cola. Al igual que sucede con las listas de tareas en cola, enviar solicitudes a la app de App Engine desde Cloud Tasks puede afectar las cuotas de solicitudes de App Engine.

Antes de migrar

En esta sección, se explica qué debes hacer antes de migrar tus listas de aplicaciones en cola a Cloud Tasks.

Migra listas de extracción

Usa la guía sobre cómo migrar las listas de extracción si deseas migrar las tuyas antes de usar esta guía para migrar las listas de aplicaciones en cola. No se recomienda migrar las listas de extracción después de migrar las listas de aplicaciones en cola, ya que es probable que el uso obligatorio del archivo queue.yaml genere un comportamiento inesperado con Cloud Tasks.

Protege la configuración de las colas

Una vez que comienzas el proceso de migración a Cloud Tasks, modificar tu archivo queue.yaml puede generar un comportamiento inesperado y no se recomienda. Protege tu configuración de cola ante las modificaciones mediante el archivo queue.yaml con los siguientes pasos.

  1. Configura la CLI de gcloud para omitir el archivo queue.yaml en implementaciones futuras.

    Agrega el archivo queue.yaml a un .gcloudignore archivo. Para verificar si ya tienes un archivo .gcloudignore, puedes ejecutar el siguiente comando en tu terminal desde el directorio de nivel superior de la app. Con este comando, se mostrará el nombre del archivo si existe.

    ls -a | grep .gcloudignore

    Para obtener más información sobre los archivos .gcloudignore, consulta la referencia de .gcloudignore.

  2. Restringe los permisos en tu archivo queue.yaml.

    Sigue las prácticas recomendadas que se describen en nuestra guía Protege la configuración de las colas.

  3. Obtén información sobre Cloud Tasks y el archivo queue.yaml (opcional).

    Cuando usas la API de Cloud Tasks para administrar la configuración de las colas, la implementación de un archivo queue.yaml anula la configuración que estableció Cloud Tasks, lo que puede causar un comportamiento inesperado. Lee Usa la administración de colas en lugar de queue.yaml para obtener más información.

Habilita la API de Cloud Tasks

Para habilitar la API de Cloud Tasks, haz clic en Habilitar en la API de Cloud Tasks de la biblioteca de la API. Si ves el botón Administrar en lugar del botón Habilitar, ya habilitaste la API de Cloud Tasks para el proyecto y no necesitas hacerlo de nuevo.

Autentica la app en la API de Cloud Tasks

Debes autenticar la app en la API de Cloud Tasks. En esta sección, se analiza la autenticación para dos casos de uso diferentes.

Para desarrollar o probar la app de forma local, te recomendamos usar una cuenta de servicio. Si deseas obtener instrucciones para configurar una cuenta de servicio y conectarla a la app, lee Obtén y proporciona las credenciales de cuenta de servicio de forma manual.

Para implementar la app en App Engine, no necesitas proporcionar ninguna autenticación nueva. Las credenciales predeterminadas de la aplicación (ADC) infieren los detalles de autenticación para las apps de App Engine.

Descarga la CLI de gcloud

Descarga y, luego, instala la CLI de gcloud para usar la CLI de gcloud con la API de Cloud Tasks si no lo instalaste antes. Ejecuta el siguiente comando desde la terminal si ya instalaste la CLI de gcloud.

gcloud components update

Importa la biblioteca cliente de Java

Sigue los pasos que se encuentran a continuación a fin de usar la biblioteca cliente de Cloud Tasks para Java con la app de App Engine:

  1. Especifica la dependencia de la biblioteca cliente de Cloud Tasks en tu archivo pom.xml:

    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-tasks</artifactId>
      <version>1.3.0</version>
    </dependency>
    
  2. Importa las dependencias de la biblioteca cliente de Cloud Tasks en los archivos que son responsables de crear y poner en cola tus tareas:

    import com.google.cloud.tasks.v2.AppEngineHttpRequest;
    import com.google.cloud.tasks.v2.CloudTasksClient;
    import com.google.cloud.tasks.v2.HttpMethod;
    import com.google.cloud.tasks.v2.QueueName;
    import com.google.cloud.tasks.v2.Task;
    

Crea y administra las colas

En esta sección, se describe cómo crear y administrar las colas mediante la API de Cloud Tasks.

Con Cloud Tasks, no usas un archivo queue.yaml para crear o administrar colas. En su lugar, debes usar la API de Cloud Tasks. No se recomienda usar un archivo queue.yaml y la API de Cloud Tasks, pero podría ser una parte inevitable de la migración de las listas de tareas en cola a Cloud Tasks según la app. Lee Usa la administración de colas en lugar de queue.yaml para obtener información sobre las prácticas recomendadas.

Crea colas

Lee esta sección si la app crea colas de manera programática o si deseas crear colas adicionales desde la línea de comandos.

En Cloud Tasks, los nombres de las colas tienen el formato projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID. La parte LOCATION_ID del nombre de la cola corresponde a una región de Google Cloud. La parte QUEUE_ID del nombre de la cola es equivalente al campo name de una cola de la lista de tareas en cola. El nombre de la cola se genera durante la creación de la cola en función del proyecto, la región y el QUEUE_ID que especifiques.

En general, la ubicación de la cola (es decir, la región) debe ser la misma que la región de la app. Las dos excepciones a esta regla son para las apps que usan la región europe-west y las que usan la región us-central. En Cloud Tasks, estas regiones se llaman europe-west1 y us-central1, respectivamente.

Puedes especificar la configuración opcional de la cola durante su creación, pero también puedes hacerlo si actualizas la cola después de crearla.

No es necesario volver a crear colas existentes. En su lugar, lee las partes pertinentes de esta guía para migrar el código que interactúa con las colas existentes.

Vuelve a usar nombres de colas

Después de borrar una cola, debes esperar 7 días para crear otra con el mismo ID en el mismo proyecto y la misma ubicación (es decir, región).

En el siguiente ejemplo, se crean dos colas mediante Cloud Tasks. La primera cola tiene el ID de cola queue-blue y está configurada para enviar todas las tareas a la versión v2 del servicio task-module con una frecuencia de 5/s. La segunda cola tiene el ID de cola queue-red y envía las tareas con una frecuencia de 1/s. Ambas se crean en el proyecto con el ID del proyecto your-project-id en la ubicación us-central1. Este es el equivalente de Cloud Tasks a crear colas en las listas de tareas en cola.

gcloud

La CLI de gcloud infiere el proyecto y la ubicación a partir de la configuración de la CLI de gcloud.

gcloud tasks queues create queue-blue \
--max-dispatches-per-second=5 \
--routing-override=service:task-module,version:v2
gcloud tasks queues create queue-red \
--max-dispatches-per-second=1

biblioteca cliente

import com.google.cloud.tasks.v2.AppEngineRouting;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;

public class CreateQueue {
  public static void createQueue(
      String projectId, String locationId, String queueBlueName, String queueRedName)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueBlueName = "queue-blue";
      // String queueRedName = "queue-red";

      LocationName parent = LocationName.of(projectId, locationId);

      Queue queueBlue =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueBlueName).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(5.0))
              .setAppEngineRoutingOverride(
                  AppEngineRouting.newBuilder().setVersion("v2").setService("task-module"))
              .build();

      Queue queueRed =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueRedName).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .build();

      Queue[] queues = new Queue[] {queueBlue, queueRed};
      for (Queue queue : queues) {
        Queue response = client.createQueue(parent, queue);
        System.out.println(response);
      }
    }
  }
}

Para obtener más información, consulta la referencia de Cloud Tasks Crea una cola de Cloud Tasks.

Configura la frecuencia de procesamiento de la cola

En la siguiente tabla, se enumeran los campos de las listas de tareas en cola que difieren de los de Cloud Tasks.

Campo de listas de tareas en cola Campo de Cloud Tasks Descripción
rate max_dispatches_per_second La frecuencia máxima con la que se envían las tareas desde la cola
max_concurrent_requests max_concurrent_dispatches La cantidad máxima de tareas simultáneas que se pueden enviar desde la cola
bucket_size max_burst_size

Cloud Tasks calcula una propiedad max_burst_size solo de GET que limita la rapidez con la que se procesan las tareas en la cola según el valor de max_dispatches_per_second. Este campo permite que la cola tenga una frecuencia alta para que el procesamiento se inicie poco después de poner la tarea en cola, pero limita el uso de recursos cuando muchas tareas se ponen en cola durante un período corto.

Para las colas de App Engine que se crearon o actualizaron con un archivo queue.xml/yaml, max_burst_size al principio es igual a bucket_size. Sin embargo, si la cola se pasa más tarde a un comando update mediante cualquier interfaz de Cloud Tasks, max_burst_size se restablecerá según el valor de max_dispatches_per_second, sin importar si max_dispatches_per_second se actualizó.

total_storage_limit Obsoleto en Cloud Tasks En la actualidad, Cloud Tasks no admite la configuración de un límite de almacenamiento personalizado

Puedes configurar la frecuencia de procesamiento de la cola cuando la crees o puedes actualizarla después. En el siguiente ejemplo, se usa Cloud Tasks para establecer la frecuencia de procesamiento en una cola llamada queue-blue que ya se creó. En el siguiente ejemplo, se restablece max_burst_size según el valor max_dispatches_per_second de 20 si se creó o configuró queue-blue mediante un archivo queue.yaml. Este es el equivalente de Cloud Tasks de establecer la frecuencia de procesamiento de colas en las listas de tareas en cola.

gcloud

gcloud tasks queues update queue-blue \
--max-dispatches-per-second=20 \
--max-concurrent-dispatches=10

biblioteca cliente

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;
import com.google.cloud.tasks.v2.UpdateQueueRequest;

public class UpdateQueue {
  public static void updateQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "queue-blue";

      LocationName parent = LocationName.of(projectId, locationId);

      Queue queueBlue =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueId).toString())
              .setRateLimits(
                  RateLimits.newBuilder()
                      .setMaxDispatchesPerSecond(20.0)
                      .setMaxConcurrentDispatches(10))
              .build();

      UpdateQueueRequest request = UpdateQueueRequest.newBuilder().setQueue(queueBlue).build();

      Queue response = client.updateQueue(request);
      System.out.println(response);
    }
  }
}

Para obtener más información, consulta Define los límites de frecuencia.

Inhabilita y reanuda colas

Cloud Tasks usa el término pausar de la misma manera que las listas de tareas en cola usan el término inhabilitar. Pausar una cola detiene la ejecución de las tareas de la cola hasta que se reanude. Sin embargo, puedes seguir agregando tareas a una cola que está en pausa. En Cloud Tasks se usa el término reanudar de la misma manera que en la lista de tareas en cola.

En el siguiente ejemplo, se pausa una cola con el ID queueName. Este es el equivalente de Cloud Tasks a inhabilitar colas en las listas de tareas en cola.

gcloud

gcloud tasks queues pause queueName

biblioteca cliente

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class PauseQueue {
  public static void pauseQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.pauseQueue(queueName);
      System.out.println("Queue Paused.");
    }
  }
}

Para obtener más información, lee la referencia Pausa colas de Cloud Tasks.

Cómo borrar colas

Una vez que borres una cola, debes esperar 7 días antes de crear una con el mismo nombre. Se recomienda que borres definitivamente todas las tareas de una cola y vuelvas a configurarla si no puedes esperar 7 días.

En el siguiente ejemplo, se borra la cola con el ID foo. Este es el equivalente de Cloud Tasks a borrar colas en las listas de tareas en cola.

gcloud

gcloud tasks queues delete foo

biblioteca cliente

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class DeleteQueue {
  public static void deleteQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.deleteQueue(queueName);
      System.out.println("Queue Deleted.");
    }
  }
}

Para obtener más información, lee la referencia de Cloud Tasks Borra colas.

Crea y administra tareas

En esta sección, se describe cómo crear y administrar tareas con la API de Cloud Tasks.

Crea tareas

En la siguiente tabla, se enumeran los campos de las listas de tareas en cola que difieren de los de Cloud Tasks.

Campo de listas de tareas en cola Campo de Cloud Tasks Descripción
NUEVO en Cloud Tasks app_engine_http_request Crea una solicitud que se orienta a un servicio de App Engine. Estas tareas se denominan tareas de App Engine.
method http_method Especifica el método de solicitud, p. ej., POST.
url relative_uri Especifica el controlador de tareas. Ten en cuenta la diferencia en la letra final: i para el identificador uniforme de recursos en lugar de l en localizador uniforme de recursos.
target app_engine_routing Opcional. Especifica el service, la version y la instance para una tarea de App Engine. Si no se establece, se usan la instancia, la versión y el servicio predeterminados.

En el siguiente ejemplo, se crea una tarea que se enruta al controlador /worker en el servicio predeterminado de App Engine. Este es el equivalente de Cloud Tasks a crear tareas en las listas de tareas en cola.

gcloud

gcloud tasks create-app-engine-task --queue=default \
--method=POST --relative-uri=/worker?key=key

biblioteca cliente

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.protobuf.ByteString;
import java.nio.charset.Charset;

public class CreateTask {
  public static void createTask(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      String key = "key";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      // Construct the task body.
      Task taskParam =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker?key=" + key)
                      .setHttpMethod(HttpMethod.GET)
                      .build())
              .build();

      Task taskPayload =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setBody(ByteString.copyFrom(key, Charset.defaultCharset()))
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Send create task request.
      Task[] tasks = new Task[] {taskParam, taskPayload};
      for (Task task : tasks) {
        Task response = client.createTask(queueName, task);
        System.out.println(response);
      }
    }
  }
}

Para obtener más información, consulta la referencia de Cloud Tasks Crea tareas de App Engine.

Especifica el servicio de destino y el enrutamiento

Especificar el servicio, la versión y la instancia de destino de App Engine para las tareas de App Engine es opcional. De forma predeterminada, las tareas de App Engine se enrutan al servicio, la versión y la instancia que son los predeterminados en el momento en que se intenta realizar la tarea.

Configura la propiedad app_engine_routing de la tarea durante su creación a fin de especificar un servicio, una versión o una instancia de App Engine diferentes para la tarea.

Si quieres enrutar todas las tareas de una cola determinada al mismo servicio, instancia o versión de App Engine, puedes establecer la propiedad app_engine_routing_override en la cola.

Para obtener más información, lee la referencia Configura el enrutamiento de Cloud Tasks.

Pasa datos al controlador

Al igual que con las listas de tareas en cola, puedes pasar datos al controlador de dos maneras con Cloud Tasks. Puedes pasar datos como parámetros de consulta en el URI relativo o puedes pasar los datos en el cuerpo de la solicitud mediante los métodos HTTP POST o PUT.

Cloud Tasks usa el término cuerpo de la misma manera que las listas de tareas en cola usan el término carga útil. En Cloud Tasks, el tipo de contenido del cuerpo predeterminado es octet-stream en lugar de texto sin formato. Puedes configurar el tipo de contenido del cuerpo si lo especificas en el encabezado.

En el siguiente ejemplo, se pasa una clave al controlador /worker de dos maneras diferentes. Este es el equivalente de Cloud Tasks a pasar datos al controlador en las listas de tareas en cola.

Console

gcloud tasks create-app-engine-task --queue=default --method=GET  \
--relative-uri=/worker?key=blue --routing=service:worker
gcloud tasks create-app-engine-task --queue=default --method=POST \
--relative-uri=/worker --routing=service:worker \
--body-content="{'key': 'blue'}"

biblioteca cliente

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.protobuf.ByteString;
import java.nio.charset.Charset;

public class CreateTask {
  public static void createTask(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      String key = "key";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      // Construct the task body.
      Task taskParam =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker?key=" + key)
                      .setHttpMethod(HttpMethod.GET)
                      .build())
              .build();

      Task taskPayload =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setBody(ByteString.copyFrom(key, Charset.defaultCharset()))
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Send create task request.
      Task[] tasks = new Task[] {taskParam, taskPayload};
      for (Task task : tasks) {
        Task response = client.createTask(queueName, task);
        System.out.println(response);
      }
    }
  }
}

Asigna nombres a las tareas

Es opcional especificar el nombre de la tarea. Si no especificas el nombre de la tarea, Cloud Tasks lo crea por ti. Para ello, genera un ID de tarea e infiere el proyecto y la ubicación (es decir, la región) en función de la cola que especificaste durante la creación de la tarea.

Los nombres de las tareas tienen el formato projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID. La parte TASK_ID del nombre de la tarea es equivalente al campo name de la lista de tareas en cola.

Vuelve a usar nombres de tareas

Debes esperar antes de volver a usar el nombre de una tarea. El tiempo que debes esperar antes de hacerlo depende de si la cola que envía la tarea se creó en Cloud Tasks o en las listas de tareas en cola.

Para las tareas en colas que se crearon mediante las listas de tareas en cola (incluida la cola predeterminada), debes esperar alrededor de 9 días después de que se borre o ejecute la tarea original. Para las tareas en colas que se crearon con Cloud Tasks, debes esperar alrededor de 1 hora después de que se borre o ejecute la tarea original.

En el siguiente ejemplo, se crea una tarea con el TASK_ID configurado como first-try y se agrega a la cola predeterminada. Este es el equivalente de Cloud Tasks a asignar nombres a tareas en las listas de tareas en cola.

gcloud

Para crear el nombre de la tarea, la CLI de gcloud infiere el proyecto y la ubicación de tu configuración.

gcloud tasks create-app-engine-task first-try --queue=default \
--method=GET --relative-uri=/worker

biblioteca cliente

Con la biblioteca cliente, debes especificar el nombre completo de la tarea si deseas especificar el TASK_ID. El proyecto y la ubicación deben coincidir con el proyecto y la ubicación de la cola a la que se agrega la tarea.

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.cloud.tasks.v2.TaskName;

public class CreateTaskWithName {
  public static void createTaskWithName(
      String projectId, String locationId, String queueId, String taskId) throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      // String taskId = "first-try"

      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      Task.Builder taskBuilder =
          Task.newBuilder()
              .setName(TaskName.of(projectId, locationId, queueId, taskId).toString())
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.GET)
                      .build());

      // Send create task request.
      Task response = client.createTask(queueName, taskBuilder.build());
      System.out.println(response);
    }
  }
}

Vuelve a intentar tareas fallidas

Puedes establecer la configuración de reintento de tareas en las colas durante la creación de la cola o cuando la actualizas. En la siguiente tabla, se muestra el campo de listas de tareas en cola y el campo de Cloud Tasks correspondiente.

Campo de listas de tareas en cola Campo de Cloud Tasks
task_retry_limit max_attempts
task_age_limit max_retry_duration
min_backoff_seconds min_backoff
max_backoff_seconds max_backoff
max_doublings max_doublings

Parámetros de reintento específicos de la tarea

Los parámetros de reintento específicos de la tarea que se configuraron en las listas de tareas en cola funcionan en Cloud Tasks, pero no puedes editarlos ni establecerlos en tareas nuevas. Para cambiar los parámetros de reintento de una tarea que tiene parámetros de reintento específicos de la tarea, vuelve a crearla con una cola de Cloud Tasks que tenga los parámetros de reintento deseados.

En el siguiente ejemplo, se muestran varias situaciones de reintento:

  • En fooqueue, las tareas se vuelven a intentar hasta siete veces y durante dos días, como máximo, desde el primer intento de ejecución. Una vez que se pasan ambos límites, la tarea falla de forma permanente.
  • En barqueue, App Engine aumenta el intervalo linealmente entre cada reintento hasta alcanzar la máxima retirada para reintentar las tareas, y lo hace de manera indefinida en el intervalo máximo (por lo que los intervalos entre solicitudes son de 10 segundos, 20, 30, …, 190, 200, 200, …).
  • En bazqueue, el intervalo de reintento comienza con 10 segundos, luego se duplica tres veces, luego aumenta linealmente y, por último, reintenta de forma indefinida en el intervalo máximo (por lo que los intervalos entre solicitudes son de 10 segundos, 20, 40, 80, 160, 240, 300, 300, …).

Este es el equivalente de Cloud Tasks a reintentar tareas en las listas de tareas en cola.

gcloud

Cuando configuras opciones que especifican una cantidad de segundos, debes incluir s después del número entero (p. ej., 200s y no 200).

gcloud tasks queues create fooqueue \
--max-attempts=7 \
--max-retry-duration=172800s  #2*60*60*24 seconds in 2 days
gcloud tasks queues create barqueue \
--min-backoff=10s \
--max-backoff=200s \
--max-doublings=0
gcloud tasks queues create bazqueue \
--min-backoff=10s \
--max-backoff=300s \
--max-doublings=3

biblioteca cliente

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;
import com.google.cloud.tasks.v2.RetryConfig;
import com.google.protobuf.Duration;

public class RetryTask {
  public static void retryTask(
      String projectId, String locationId, String fooqueue, String barqueue, String bazqueue)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String fooqueue = "fooqueue";
      // String barqueue = "barqueue";
      // String bazqueue = "bazqueue";

      LocationName parent = LocationName.of(projectId, locationId);

      Duration retryDuration = Duration.newBuilder().setSeconds(2 * 60 * 60 * 24).build();
      Duration min = Duration.newBuilder().setSeconds(10).build();
      Duration max1 = Duration.newBuilder().setSeconds(200).build();
      Duration max2 = Duration.newBuilder().setSeconds(300).build();

      Queue foo =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, fooqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder().setMaxAttempts(7).setMaxRetryDuration(retryDuration))
              .build();

      Queue bar =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, barqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder()
                      .setMinBackoff(min)
                      .setMaxBackoff(max1)
                      .setMaxDoublings(0))
              .build();

      Queue baz =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, bazqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder()
                      .setMinBackoff(min)
                      .setMaxBackoff(max2)
                      .setMaxDoublings(3))
              .build();

      Queue[] queues = new Queue[] {foo, bar, baz};
      for (Queue queue : queues) {
        Queue response = client.createQueue(parent, queue);
        System.out.println(response);
      }
    }
  }
}

Para obtener más información, consulta la referencia de Cloud Tasks Configura parámetros de reintento.

Borra tareas de una cola

Cuando borras una tarea que se encontraba en una cola creada con el archivo queue.yaml, debes esperar hasta 9 días antes de crear una con el mismo nombre, o 1 hora si la tarea se encontraba en una cola que se creó mediante Cloud Tasks.

En el siguiente ejemplo, se borra la tarea con el ID foo de la cola con el ID queue1. Este es el equivalente de Cloud Tasks a borrar tareas en las listas de tareas en cola.

gcloud

El proyecto y la ubicación de la tarea se infieren del proyecto predeterminado de la CLI de gcloud.

gcloud tasks delete foo --queue=queue1

biblioteca cliente

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.TaskName;

public class DeleteTask {
  public static void deleteTask(String projectId, String locationId, String queueId, String taskId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "queue1";
      // String taskId = "foo";

      // Construct the fully qualified queue name.
      String taskName = TaskName.of(projectId, locationId, queueId, taskId).toString();

      client.deleteTask(taskName);
      System.out.println("Task Deleted.");
    }
  }
}

Para obtener más información, consulta la referencia de Cloud Tasks Borra una tarea de una cola.

Borra definitivamente las tareas

En el siguiente ejemplo, se borran definitivamente todas las tareas de la cola con el ID foo. Este es el equivalente de Cloud Tasks a borrar definitivamente las tareas de las listas de tareas en cola.

gcloud

El proyecto y la ubicación de la cola se infieren del proyecto predeterminado de la CLI de gcloud.

gcloud tasks queues purge foo

biblioteca cliente

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class PurgeQueue {
  public static void purgeQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.purgeQueue(queueName);
      System.out.println("Queue Purged.");
    }
  }
}

Para obtener más información, consulta la referencia de Cloud Tasks Borra definitivamente todas las tareas de una cola.

Un ejemplo de Cloud Tasks para Java 8

En el siguiente ejemplo, se muestra una configuración básica para crear una cola y poner una tarea en cola con Cloud Tasks. Se supone que el desarrollador creó un archivo pom.xml para especificar la dependencia de Cloud Tasks, como se describe en la sección Importa la biblioteca cliente. Este es el equivalente de Cloud Tasks a un ejemplo de la lista de tareas en cola para Java 8 de las listas de tareas en cola.

El archivo que es responsable de crear y poner en cola la tarea crea una tarea y la agrega a la cola predeterminada mediante la biblioteca cliente de Cloud Tasks para Java:

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "TaskEnqueue",
    description = "Enqueue a task targeted at endpoint '/cloudtasks/worker'",
    urlPatterns = "/cloudtasks/enqueue")
public class Enqueue extends HttpServlet {

  // TODO(developer): Replace these variables before running the sample.
  static final String projectId = "my-project-id";
  static final String locationId = "us-central1";

  // Function creates Cloud Tasks from form submissions.
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String key = request.getParameter("key");

    try (CloudTasksClient client = CloudTasksClient.create()) {
      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, "default").toString();

      // Construct the task body.
      Task task =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/cloudtasks/worker?key=" + key)
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Add the task to the default queue.
      Task taskResponse = client.createTask(queueName, task);
      System.out.println("Task created: " + taskResponse.getName());
    }

    response.sendRedirect("/");
  }
}

El siguiente archivo es el que define el trabajador que controla la tarea:

import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "TaskWorker",
    description = "Endpoint to process Cloud Task requests",
    urlPatterns = "/cloudtasks/worker"
)
public class Worker extends HttpServlet {

  private static final Logger log = Logger.getLogger(Worker.class.getName());

  // Worker function to process POST requests from Cloud Tasks targeted at the
  // '/cloudtasks/worker' endpoint.
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String key = request.getParameter("key");
    log.info("Worker is processing " + key);
  }
}

¿Qué sigue?