Migrar colas de salida a Cloud Tasks (Java)

En esta página se describe cómo migrar código de colas de salida de Colas de tareas a Cloud Tasks. Cloud Tasks es ahora la forma preferida de trabajar con las colas de inserción de App Engine.

Con Cloud Tasks, accedes al mismo servicio que con la API RPC Task Queues. Esto significa que no tienes que volver a crear las colas y tareas push que ya tengas. Sin embargo, debes migrar el código que crea o interactúa con colas o tareas push para usar la API Cloud Tasks.

Puedes crear colas de inserción y tareas de inserción, así como interactuar con ellas, mediante las APIs REST y RPC de Cloud Tasks, la biblioteca de cliente de Cloud Tasks, Google Cloud CLI y la consolaGoogle Cloud . En esta página se proporcionan ejemplos con la CLI de gcloud y la biblioteca de cliente de Cloud Tasks.

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

Funciones no disponibles en Cloud Tasks

Las siguientes funciones no están disponibles en Cloud Tasks:

  • Poner tareas en cola en transacciones de Datastore
  • Usar la biblioteca de tareas diferidas en lugar de un servicio de trabajador
  • Trabajar con tareas en aplicaciones multicliente
  • Simular con el servidor de desarrollo local
  • Agregar tareas asincrónicamente

Precios y cuotas

Migrar tus colas de salida a Cloud Tasks puede afectar a los precios y las cuotas de tu aplicación.

Precios

Cloud Tasks tiene sus propios precios. Al igual que con las colas de tareas, enviar solicitudes a tu aplicación de App Engine con una tarea puede generar costes.

Cuotas

Las cuotas de Cloud Tasks son diferentes de las de las colas de tareas. Al igual que con las colas de tareas, el envío de solicitudes a tu aplicación de App Engine desde Cloud Tasks puede afectar a tus cuotas de solicitudes de App Engine.

Antes de la migración

En las siguientes secciones se describen los pasos de configuración que debes seguir antes de migrar tus colas de inserción a Cloud Tasks.

Migrar colas para tareas extraídas

Antes de empezar, migra las colas de extracción antes de seguir las instrucciones de esta guía para migrar las colas de inserción. No se recomienda migrar colas de extracción después de migrar colas de salida, ya que es probable que el uso obligatorio del archivo queue.yaml provoque un comportamiento inesperado en Cloud Tasks.

Proteger la configuración de colas

Una vez que empieces el proceso de migración a Cloud Tasks, modificar el archivo queue.yaml puede provocar un comportamiento inesperado, por lo que no se recomienda. Protege la configuración de tu cola frente a modificaciones mediante el archivo queue.yaml siguiendo estos pasos.

  1. Configura gcloud CLI para que omita el archivo queue.yaml en futuras implementaciones.

    Añade tu archivo queue.yaml a un archivo .gcloudignore. Para comprobar si ya tienes un archivo .gcloudignore, puedes ejecutar el siguiente comando en el terminal desde el directorio de nivel superior de tu aplicación. Este comando mostrará el nombre del archivo si existe.

    ls -a | grep .gcloudignore

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

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

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

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

    Cuando se usa la API Cloud Tasks para gestionar la configuración de la cola, al desplegar un archivo queue.yaml se sobrescribe la configuración definida por Cloud Tasks, lo que puede provocar un comportamiento inesperado. Consulta el artículo Comparación entre la gestión de colas y queue.yaml para obtener más información.

Habilitar la API de Cloud Tasks

Para habilitar la API Cloud Tasks, haz clic en Habilitar en la página de la API Cloud Tasks de la biblioteca de APIs. Si ves el botón Gestionar en lugar del botón Habilitar, significa que ya has habilitado la API Cloud Tasks en tu proyecto y no tienes que volver a hacerlo.

Autenticar tu aplicación en la API Cloud Tasks

Debes autenticar tu aplicación en la API Cloud Tasks. En esta sección se explica la autenticación en dos casos prácticos diferentes.

Para desarrollar o probar tu aplicación de forma local, te recomendamos que uses una cuenta de servicio. Para obtener instrucciones sobre cómo configurar una cuenta de servicio y conectarla a tu aplicación, consulta Obtener y proporcionar credenciales de cuenta de servicio manualmente.

Para desplegar tu aplicación en App Engine, no tienes que proporcionar ninguna autenticación nueva. Las credenciales de aplicación predeterminadas (ADC) infieren los detalles de autenticación de las aplicaciones de App Engine.

Descargar la CLI de gcloud

Descarga e instala la CLI de gcloud para usarla con la API Cloud Tasks si no la has instalado antes. Ejecuta el siguiente comando desde tu terminal si ya tienes instalada la CLI de gcloud.

gcloud components update

Importar las bibliotecas de cliente de Cloud

Para usar la biblioteca de cliente de Cloud Tasks con tu aplicación de App Engine, sigue estos pasos:

  1. Especifica la dependencia de la biblioteca de cliente de Cloud Tasks en el 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 de cliente de Cloud Tasks en los archivos 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;

Crear y gestionar colas

En esta sección se describe cómo crear y gestionar colas mediante la API Cloud Tasks.

Con Cloud Tasks, no se usa un archivo queue.yaml para crear o gestionar colas. En su lugar, usa la API Cloud Tasks. No se recomienda usar un archivo queue.yaml y la API Cloud Tasks al mismo tiempo, pero puede que sea inevitable al migrar de Colas de tareas a Cloud Tasks, en función de tu aplicación. Consulta Usar la gestión de colas en lugar de queue.yaml para obtener información sobre las prácticas recomendadas.

Crear colas

Lee esta sección si tu aplicación crea colas de forma programática o si quieres 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 Google Cloud región. La parte QUEUE_ID del nombre de la cola equivale al campo name de la cola de tareas. 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.

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

Puedes especificar una configuración de cola opcional durante la creación de la cola, pero también puedes hacerlo actualizando la cola una vez creada.

No es necesario que vuelvas a crear las colas que ya tengas. En su lugar, migre el código que interactúa con sus colas leyendo las partes pertinentes de esta guía.

Reutilizar nombres de colas

Debes esperar 7 días después de eliminar una cola para crear otra con el mismo ID de cola en el mismo proyecto y ubicación (es decir, región).

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

gcloud

La CLI de gcloud deduce el proyecto y la ubicación 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 de 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 sobre cómo crear una cola de Cloud Tasks.

Definir la velocidad de procesamiento de la cola

En la siguiente tabla se enumeran los campos que difieren entre Task Queues y Cloud Tasks.

Campo Colas de tareas Campo Cloud Tasks Descripción
rate max_dispatches_per_second Frecuencia máxima con la que las tareas se distribuyen desde la cola.
max_concurrent_requests max_concurrent_dispatches Número máximo de tareas simultáneas que se pueden distribuir desde la cola.
bucket_size max_burst_size

Cloud Tasks calcula una propiedad de solo lectura max_burst_size que limita la velocidad a la que se procesan las tareas de la cola en función del valor de max_dispatches_per_second. Este campo permite que la cola tenga una tasa alta para que el procesamiento empiece poco después de que se ponga en cola una tarea, pero sigue limitando el uso de recursos cuando se ponen en cola muchas tareas en un breve periodo.

En las colas de App Engine que se hayan creado o actualizado mediante un archivo queue.xml/yaml, max_burst_size es inicialmente igual a bucket_size. Sin embargo, si la cola se envía más adelante a un comando update mediante cualquier interfaz de Cloud Tasks, max_burst_size se restablecerá en función del valor de max_dispatches_per_second, independientemente de si max_dispatches_per_second se actualiza o no.

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

Puedes definir la tasa de procesamiento de la cola al crearla o actualizarla posteriormente. En el siguiente ejemplo se usa Cloud Tasks para definir la velocidad de procesamiento de una cola llamada queue-blue que ya se ha creado. Si se ha creado o configurado queue-blue mediante un archivo queue.yaml, el siguiente ejemplo restablece max_burst_size en función del valor max_dispatches_per_second de 20. Es el equivalente en Cloud Tasks de definir la tasa de procesamiento de la cola en Colas de tareas.

gcloud

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

biblioteca de 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 Definir límites de frecuencia.

Inhabilitar y reanudar colas

Cloud Tasks usa el término pausa de la misma forma que Task Queues usa el término inhabilitar. Si pausas una cola, las tareas que contiene dejarán de ejecutarse hasta que se reanude. Sin embargo, puedes seguir añadiendo tareas a una cola que esté en pausa. Cloud Tasks usa el término reanudar de la misma forma que Task Queues.

En el siguiente ejemplo se pausa una cola con el ID queueName . Es el equivalente de Cloud Tasks a inhabilitar colas en Colas de tareas.

gcloud

gcloud tasks queues pause 

queueName

biblioteca de 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, consulta la referencia de Cloud Tasks sobre cómo pausar colas.

Eliminar colas

Una vez que elimines una cola, debes esperar 7 días antes de crear otra con el mismo nombre. Si no puedes esperar 7 días, puedes eliminar todas las tareas de una cola y volver a configurar la cola.

En el siguiente ejemplo se elimina la cola con el ID foo . Este es el equivalente de Cloud Tasks a la eliminación de colas en Colas de tareas.

gcloud

gcloud tasks queues delete 

foo

biblioteca de 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, consulta la referencia de Cloud Tasks sobre cómo eliminar colas.

Crear y gestionar tareas

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

Crear tareas

En la siguiente tabla se enumeran los campos que difieren entre Task Queues y Cloud Tasks.

Campo Colas de tareas Campo Cloud Tasks Descripción
Novedades de Cloud Tasks app_engine_http_request Crea una solicitud dirigida a un servicio de App Engine. Estas tareas se denominan tareas de App Engine.
method http_method Especifica el método de solicitud. Por ejemplo, POST.
url relative_uri Especifica el controlador de tareas. Ten en cuenta la diferencia en la última letra: i para identificador uniforme de recursos en lugar de l para localizador uniforme de recursos.
target app_engine_routing Opcional. Especifica el service, version y instance de App Engine para una tarea de App Engine. Si no se definen, se usan el servicio, la versión y la instancia predeterminados.

En el ejemplo siguiente se crea una tarea que se dirige al controlador /worker en el servicio predeterminado de App Engine. Es el equivalente de Cloud Tasks a crear tareas en Colas de tareas.

gcloud

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

biblioteca de 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 sobre creación de tareas de App Engine.

Especificar 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 dirigen al servicio, la versión y la instancia que sean predeterminados en el momento en que se intente realizar la tarea.

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

Para dirigir todas las tareas de una cola determinada al mismo servicio, versión e instancia de App Engine, puede definir la propiedad app_engine_routing_override en la cola.

Para obtener más información, consulta la referencia de Cloud Tasks sobre cómo configurar el enrutamiento.

Transferir datos al controlador

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

Cloud Tasks usa el término body de la misma forma que Task Queues usa el término payload. En Cloud Tasks, el tipo de contenido predeterminado del cuerpo es octet-stream en lugar de texto sin formato. Puedes definir el tipo de contenido del cuerpo especificándolo en el encabezado.

En el siguiente ejemplo se pasa una clave al controlador /worker de dos formas diferentes. Es el equivalente en Cloud Tasks de transferir datos al controlador en las colas de tareas.

consola

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 de 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);
      }
    }
  }
}

Asignar nombres a las tareas

Especificar el nombre de la tarea es opcional. Si no especificas el nombre de la tarea, Cloud Tasks lo creará por ti. Para ello, generará un ID de tarea e inferirá el proyecto y la ubicación (es decir, la región) en función de la cola que hayas especificado al crear 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 equivale al campo name de la tarea de colas de tareas.

Reutilizar nombres de tareas

Debes esperar antes de volver a usar el nombre de una tarea. El tiempo que debes esperar antes de hacerlo varía en función de si la cola que envía la tarea se ha creado en Cloud Tasks o en Colas de tareas.

En el caso de las tareas de las colas creadas con Colas de tareas (incluida la cola predeterminada), debes esperar aproximadamente 9 días después de que se haya eliminado o ejecutado la tarea original. En el caso de las tareas de las colas creadas con Cloud Tasks, debes esperar aproximadamente una hora después de que se haya eliminado o ejecutado la tarea original.

En el siguiente ejemplo se crea una tarea con el valor first-try en TASK_ID y se añade a la cola predeterminada. Es el equivalente en Cloud Tasks de asignar nombres a las tareas en Colas de tareas.

gcloud

La CLI de gcloud crea el nombre de la tarea infiriendo el proyecto y la ubicación a partir de tu configuración.

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

/worker

biblioteca de cliente

Con la biblioteca cliente, debes especificar el nombre completo de la tarea si quieres 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 añade 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);
    }
  }
}

Reintentar tareas fallidas

Puedes configurar la reintentos de tareas en las colas durante la creación de la cola o actualizando la cola. En la tabla siguiente se enumeran los campos de colas de tareas y los campos de Cloud Tasks correspondientes.

Campo Colas de tareas Campo 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 las tareas que se configuraron en Task Queues funcionan en Cloud Tasks, pero no puedes editarlos ni definirlos 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 crear la tarea con una cola de Cloud Tasks que tenga los parámetros de reintento que quieras.

En el siguiente ejemplo se incluyen distintas situaciones de reintento:

  • En fooqueue, las tareas se vuelven a intentar hasta siete veces y durante un máximo de dos días desde el primer intento de ejecución. Una vez superados ambos límites, se produce un error permanente.
  • En barqueue, App Engine intenta volver a ejecutar las tareas, aumentando el intervalo de forma lineal entre cada reintento hasta alcanzar el tiempo de espera máximo y volviendo a intentar indefinidamente en el intervalo máximo (por lo que los intervalos entre solicitudes son 10 s, 20 s, 30 s, ..., 190 s, 200 s, 200 s, ...).
  • En bazqueue, el intervalo de reintento comienza en 10 s, después se duplica tres veces, aumenta de manera lineal y, por último, se reintenta indefinidamente en el intervalo máximo (por lo que los intervalos entre solicitudes son 10 s, 20 s, 40 s, 80 s, 160 s, 240 s, 300 s, 300 s, etc.).

Es el equivalente de Cloud Tasks a la opción de reintentar tareas en las colas de tareas.

gcloud

Cuando defina opciones que especifiquen un número de segundos, debe incluir s después del número entero (por ejemplo, 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 de 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 sobre configurar parámetros de reintento.

Eliminar tareas de una cola

Cuando eliminas una tarea, debes esperar 9 días antes de crear una tarea con el mismo nombre si la tarea estaba en una cola creada con un archivo queue.yaml, o 1 hora si la tarea estaba en una cola creada con Cloud Tasks.

En el siguiente ejemplo se elimina la tarea con el ID foo de la cola con el ID queue1. Es el equivalente en Cloud Tasks de eliminar tareas en Colas de tareas.

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 de 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 sobre cómo eliminar una tarea de una cola.

Purgar tareas

En el siguiente ejemplo, se eliminan todas las tareas de la cola con el ID foo . Esta es la equivalente de Cloud Tasks a la eliminación de tareas en las colas de tareas.

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 de 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 sobre cómo purgar todas las tareas de una cola.

Ejemplo de Cloud Tasks de Java 8

En el siguiente ejemplo se muestra una configuración básica para crear una cola y añadirle una tarea con Cloud Tasks. Se presupone que el desarrollador ha creado un archivo pom.xml para especificar la dependencia de Cloud Tasks, tal como se describe en la sección Importar la biblioteca de cliente. Este es el equivalente de Cloud Tasks del ejemplo de cola de tareas de Java 8 de Colas de tareas.

El archivo responsable de crear y poner en cola la tarea crea una tarea y la añade a la cola predeterminada mediante la biblioteca de cliente de Cloud Tasks:

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 archivo que define el trabajador gestiona 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);
  }
}

Siguientes pasos