Crear tareas de destino HTTP

Los controladores de Cloud Tasks se pueden ejecutar en cualquier endpoint HTTP con una dirección IP externa, como GKE o Compute Engine, o incluso en un servidor web on-premise. Tus tareas se pueden ejecutar en cualquiera de estos servicios de forma fiable y configurable.

En esta página se muestra cómo crear mediante programación tareas de destino HTTP básicas y colocarlas en colas de Cloud Tasks. En la guía de inicio rápido se muestra cómo hacerlo con la CLI de Google Cloud.

En el caso de las tareas que tienen destinos HTTP (en lugar de destinos explícitos de App Engine, que son menos habituales), hay dos formas de crear tareas:

  • Método CreateTask: debes crear explícitamente un objeto de tarea. Usa este método si las tareas de tu cola tienen configuraciones de enrutamiento diferentes. En este caso, se especifica el enrutamiento a nivel de tarea y no se puede usar el enrutamiento a nivel de cola. Este enfoque usa el método CreateTask.

  • Método BufferTask: usa este método si tu cola está configurada para almacenar en búfer las tareas delante de un servicio. La cola debe tener un enrutamiento a nivel de cola. Este enfoque usa el método BufferTask.

Crear una tarea con el método CreateTask

En esta sección se explica cómo crear una tarea construyendo el objeto de tarea. Usas el método CreateTask.

Cuando creas una tarea con el método CreateTask, creas y defines explícitamente el objeto de tarea. Debes especificar el servicio y el controlador que procesan la tarea.

También puedes enviar datos específicos de la tarea al controlador. También puedes ajustar la configuración de la tarea, como programar una hora en el futuro para que se ejecute o limitar el número de veces que quieres que se vuelva a intentar la tarea si falla (consulta Configuración avanzada).

En los siguientes ejemplos se llama al método CreateTask para crear una tarea mediante las bibliotecas de cliente de Cloud Tasks.

C#


using Google.Cloud.Tasks.V2;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using System;

class CreateHttpTask
{
    public string CreateTask(
        string projectId = "YOUR-PROJECT-ID",
        string location = "us-central1",
        string queue = "my-queue",
        string url = "http://example.com/taskhandler",
        string payload = "Hello World!",
        int inSeconds = 0)
    {
        CloudTasksClient client = CloudTasksClient.Create();
        QueueName parent = new QueueName(projectId, location, queue);

        var response = client.CreateTask(new CreateTaskRequest
        {
            Parent = parent.ToString(),
            Task = new Task
            {
                HttpRequest = new HttpRequest
                {
                    HttpMethod = HttpMethod.Post,
                    Url = url,
                    Body = ByteString.CopyFromUtf8(payload)
                },
                ScheduleTime = Timestamp.FromDateTime(
                    DateTime.UtcNow.AddSeconds(inSeconds))
            }
        });

        Console.WriteLine($"Created Task {response.Name}");
        return response.Name;
    }
}

Go


// Command createHTTPtask constructs and adds a task to a Cloud Tasks Queue.
package main

import (
	"context"
	"fmt"

	cloudtasks "cloud.google.com/go/cloudtasks/apiv2"
	taskspb "cloud.google.com/go/cloudtasks/apiv2/cloudtaskspb"
)

// createHTTPTask creates a new task with a HTTP target then adds it to a Queue.
func createHTTPTask(projectID, locationID, queueID, url, message string) (*taskspb.Task, error) {

	// Create a new Cloud Tasks client instance.
	// See https://godoc.org/cloud.google.com/go/cloudtasks/apiv2
	ctx := context.Background()
	client, err := cloudtasks.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	// Build the Task queue path.
	queuePath := fmt.Sprintf("projects/%s/locations/%s/queues/%s", projectID, locationID, queueID)

	// Build the Task payload.
	// https://godoc.org/google.golang.org/genproto/googleapis/cloud/tasks/v2#CreateTaskRequest
	req := &taskspb.CreateTaskRequest{
		Parent: queuePath,
		Task: &taskspb.Task{
			// https://godoc.org/google.golang.org/genproto/googleapis/cloud/tasks/v2#HttpRequest
			MessageType: &taskspb.Task_HttpRequest{
				HttpRequest: &taskspb.HttpRequest{
					HttpMethod: taskspb.HttpMethod_POST,
					Url:        url,
				},
			},
		},
	}

	// Add a payload message if one is present.
	req.Task.GetHttpRequest().Body = []byte(message)

	createdTask, err := client.CreateTask(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("cloudtasks.CreateTask: %w", err)
	}

	return createdTask, nil
}

Java

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

public class CreateHttpTask {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "my-project-id";
    String locationId = "us-central1";
    String queueId = "my-queue";
    createTask(projectId, locationId, queueId);
  }

  // Create a task with a HTTP target using the Cloud Tasks client.
  public static void createTask(String projectId, String locationId, String queueId)
      throws IOException {

    // Instantiates a client.
    try (CloudTasksClient client = CloudTasksClient.create()) {
      String url = "https://example.com/taskhandler";
      String payload = "Hello, World!";

      // Construct the fully qualified queue name.
      String queuePath = QueueName.