Stay organized with collections
Save and categorize content based on your preferences.
You can create HTTP tasks using either the BufferTask method or the
CreateTask method. This page provides guidance on how to choose between the
two methods for creating HTTP tasks.
The BufferTask method lets you create a task by sending an HTTP request to the
queue. The CreateTask method lets you create a task by constructing the task
object. For most use cases, explicitly constructing the task object is
unnecessary. The best method for creating tasks depends on whether your queue
has queue-level routing.
Before you begin
Check the following list of use cases to see if any apply to you:
You want to create tasks using the RPC API or client libraries (rather than
the REST API)
You want to create tasks as
App Engine task objects (rather than as
the more typical task objects for generic HTTP targets which may or may not be
App Engine targets)
If any of these apply to you, you don't need to choose your task creation method
because only one method (the CreateTask method) is supported. Go directly to
the CreateTask documentation for your task type:
LOCATION: the region
where your queue is located. If not specified, and if there is an associated
app, the location of your project's
App Engine app
is used.
In the output, look for the field httpTarget and check if the
uriOverride has been set.
If the output includes a line for uriOverride with a host specified,
your queue has queue-level routing. To choose your task creation method, see
the section Queues with queue-level routing.
If the output does not include a line for uriOverride or if the
uriOverride description does not show a host specified, your queue does
not have queue-level routing. To choose your task creation method, see the
section Queues without queue-level routing (or
configure queue-level routing).
Queues with queue-level routing
For queues with queue-level routing, the task creation method depends on the
task's routing requirements:
Task has the same routing requirements as specified at the queue level:
Use BufferTask. Learn how to create tasks with the
BufferTask
method.
Task has different routing requirements from those specified at the queue-level:
Set the queue's
UriOverrideEnforceMode
to IF_NOT_EXISTS to ensure that the queue-level routing applies to tasks for
which routing does not exist (for example, BufferTask tasks), but respects
the routing of tasks that carry their own routing specifications. Then use
CreateTask. This method lets you specify individual routing for the task.
Learn how to create tasks with the
CreateTask
method.
Queues without queue-level routing
For queues without queue-level routing, create tasks by using the CreateTask
method (or
configure
queue-level routing). The CreateTask method includes specifying routing for
the task, which is required for queues that don't already have routing
information at the queue-level. Learn how to create tasks with the
CreateTask
method.
Understand queue-level routing
Queue-level routing lets you specify default routing information for tasks based
on the queue they're in. You can specify whether you want the default routing to
apply only to tasks that don't have their own routing information, or to all
tasks.
Choose queue-level routing if you want to:
Create tasks with standard HTTP requests (rather than by constructing the task
object)
Use a queue as a buffer in front of a target service
The per-target approach
Queue-level routing works best with architectures that use one queue for each
target service. This model lets you:
Manage tasks based on their target (for example, redirecting a group of
tasks if the target service is down)
Send all tasks in a queue to the same target
Create tasks without explicitly constructing the task object by using the
BufferTask method
Turning queue-level override behavior on and off
Once you configure queue-level routing, you can decide when it gets enforced by
setting the queue's
UriOverrideEnforceMode.
IF_NOT_EXISTS: The queue-level routing applies only when a task doesn't
contain its own routing information. Use this setting if you want the queue
to be able to dispatch tasks to different targets.
ALWAYS: The queue-level routing always applies, even if a task contains its
own routing information. Any routing information set at the task level is
overridden by the queue-level routing. Use this setting if you want to
require tasks in a given queue to use the same routing information.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-25 UTC."],[],[],null,["# Choose your task creation method\n\nYou can create HTTP tasks using either the `BufferTask` method or the\n`CreateTask` method. This page provides guidance on how to choose between the\ntwo methods for creating HTTP tasks.\n\nThe `BufferTask` method lets you create a task by sending an HTTP request to the\nqueue. The `CreateTask` method lets you create a task by constructing the task\nobject. For most use cases, explicitly constructing the task object is\nunnecessary. The best method for creating tasks depends on whether your queue\nhas queue-level routing.\n\nBefore you begin\n----------------\n\nCheck the following list of use cases to see if any apply to you:\n\n- You want to create tasks using the RPC API or client libraries (rather than the REST API)\n- You want to create tasks as [App Engine task](/tasks/docs/dual-overview#appe) objects (rather than as the more typical task objects for generic HTTP targets which may or may not be App Engine targets)\n\nIf any of these apply to you, you don't need to choose your task creation method\nbecause only one method (the `CreateTask` method) is supported. Go directly to\nthe `CreateTask` documentation for your task type:\n\n- [HTTP tasks](/tasks/docs/creating-http-target-tasks#createtask_method)\n- [App Engine tasks](/tasks/docs/creating-appengine-tasks)\n\nCheck if your queue has queue-level routing\n-------------------------------------------\n\n1. Run the [gcloud tasks queues describe](/sdk/gcloud/reference/tasks/queues/describe)\n command in your terminal:\n\n ```bash\n gcloud tasks queues describe QUEUE_NAME \\\n --location=LOCATION\n ```\n\n Replace the following:\n - \u003cvar translate=\"no\"\u003eQUEUE_NAME\u003c/var\u003e: the name of your queue.\n - \u003cvar translate=\"no\"\u003eLOCATION\u003c/var\u003e: the [region](/tasks/docs/locations) where your queue is located. If not specified, and if there is an associated app, the location of your project's [App Engine app](/appengine/docs/standard/managing-projects-apps-billing) is used.\n2. In the output, look for the field `httpTarget` and check if the\n `uriOverride` has been set.\n\n - If the output includes a line for `uriOverride` with a `host` specified,\n your queue has queue-level routing. To choose your task creation method, see\n the section [Queues with queue-level routing](#queue-level-routing).\n\n - If the output does not include a line for `uriOverride` or if the\n `uriOverride` description does not show a `host` specified, your queue does\n not have queue-level routing. To choose your task creation method, see the\n section [Queues without queue-level routing](#no-queue-level-routing) (or\n [configure queue-level routing](/tasks/docs/configuring-queues#configure_queue-level_routing_for_http_tasks)).\n\nQueues with queue-level routing\n-------------------------------\n\nFor queues with queue-level routing, the task creation method depends on the\ntask's routing requirements:\n\n- **Task has the same routing requirements as specified at the queue level:** Use `BufferTask`. Learn how to create tasks with the [`BufferTask`](/tasks/docs/creating-http-target-tasks#buffertask_method) method.\n- **Task has different routing requirements from those specified at the queue-level:** Set the queue's [UriOverrideEnforceMode](/tasks/docs/reference/rest/v2/projects.locations.queues#UriOverrideEnforceMode) to `IF_NOT_EXISTS` to ensure that the queue-level routing applies to tasks for which routing does not exist (for example, `BufferTask` tasks), but respects the routing of tasks that carry their own routing specifications. Then use `CreateTask`. This method lets you specify individual routing for the task. Learn how to create tasks with the [`CreateTask`](/tasks/docs/creating-http-target-tasks#createtask_method) method.\n\nQueues without queue-level routing\n----------------------------------\n\nFor queues without queue-level routing, create tasks by using the `CreateTask`\nmethod (or\n[configure](/tasks/docs/configuring-queues#configure_queue-level_routing_for_http_tasks)\nqueue-level routing). The `CreateTask` method includes specifying routing for\nthe task, which is required for queues that don't already have routing\ninformation at the queue-level. Learn how to create tasks with the\n[`CreateTask`](/tasks/docs/creating-http-target-tasks#createtask_method)\nmethod.\n\nUnderstand queue-level routing\n------------------------------\n\nQueue-level routing lets you specify default routing information for tasks based\non the queue they're in. You can specify whether you want the default routing to\napply only to tasks that don't have their own routing information, or to all\ntasks.\n\nChoose queue-level routing if you want to:\n\n- Create tasks with standard HTTP requests (rather than by constructing the task object)\n- Use a queue as a buffer in front of a target service\n\n| **Note:** In the case of App Engine targets, any routing done by Cloud Tasks is handled prior to any routing defined in an [App Engine dispatch file](/appengine/docs/flexible/how-requests-are-routed?tab=python#dispatch). This dispatch file lets you send incoming requests to a specific service based on the path or hostname in the request URL.\n\n### The per-target approach\n\nQueue-level routing works best with architectures that use one queue for each\ntarget service. This model lets you:\n\n- Manage tasks based on their target (for example, redirecting a group of tasks if the target service is down)\n- Send all tasks in a queue to the same target\n- Create tasks without explicitly constructing the task object by using the `BufferTask` method\n\n### Turning queue-level override behavior on and off\n\nOnce you configure queue-level routing, you can decide when it gets enforced by\nsetting the queue's\n[UriOverrideEnforceMode](/tasks/docs/reference/rest/v2/projects.locations.queues#UriOverrideEnforceMode).\n\n- `IF_NOT_EXISTS`: The queue-level routing applies only when a task doesn't contain its own routing information. Use this setting if you want the queue to be able to dispatch tasks to different targets.\n- `ALWAYS`: The queue-level routing always applies, even if a task contains its own routing information. Any routing information set at the task level is overridden by the queue-level routing. Use this setting if you want to require tasks in a given queue to use the same routing information."]]