有没有办法使用 App Engine Java 运行时动态设置任务的目标



使用 App Engine Python 运行时对后台任务进行排队时,您可以为队列指定一个目标,该队列将发送要在特定服务、版本或实例上运行的任务:

task = taskqueue.add(
url='/update_counter',
target='worker',
params={'amount': amount})

有没有办法在Java中做到这一点?该文档提到了target参数,但没有显示如何使用它的示例。Queue.add方法没有target的选项。TaskOptions类也没有看起来像target的东西。

这个问题记录了如何使用target,但答案是在queue.xml中配置它。我想在运行时选择目标,比如 Python。

TL;DR- 根据早期版本的文档,可能有一种方法可以执行此操作,但最新版本的文档中未对此进行描述。

基于最新文档的方法

根据有关推送队列的最新文档(如您所提到的),您可以在每个队列queue.xml中配置目标模块、版本。如果指定,则任务请求将发送到指定目标。正如您已经描述的,这是一个静态配置,并不能真正回答您的问题(为了完整起见而描述)。

<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
<queue>
<name>queue-blue</name>
<target>v2.task-module</target>
</queue>
<queue>
<name>queue-red</name>
<rate>1/s</rate>
</queue>
</queue-entries>

在用于创建任务和指定辅助角色服务的文档中,它描述了为任务选择的目标,但没有明确描述如何指定它。

当任务从其队列中弹出时,任务队列服务会发送它 转到辅助角色服务。每个任务都有一个目标和一个 url,它们 确定哪个服务和处理程序最终将执行任务。

target

目标指定将接收 HTTP 请求的服务 执行任务。它是一个字符串,指定 服务/版本/实例采用任何一种规范形式。最 经常使用的有:

service
version.service
instance.version.service

目标字符串将附加到应用的域名前面。那里 是设置任务目标的三种方法:

  • 显式声明在构造任务时的目标。
  • 在队列.xml中定义队列时包括目标指令,如上面的 queue-blue 定义所示。添加到队列中的所有任务 使用目标将使用该目标,即使其他目标是 在施工时分配给任务。
  • 如果未根据前两种方法中的任何一种指定目标,则任务的目标是 将其排队。请注意,如果从默认服务对任务进行排队 和以这种方式的版本,并且默认版本在 任务执行,它将在新的默认版本中运行。

url

url选择目标服务中的一个处理程序,这将 执行任务。

url应与目标中的处理程序 URL 模式之一匹配 服务。如果任务的方法为GETPULL.如果未指定 url,则默认 URL 使用/_ah/queue/[QUEUE_NAME],其中[QUEUE_NAME]是 任务的队列。

根据上述文档,如果您查看TaskOptions.Builder,则没有指定任务目标的方法。这可能表示缺少有关如何指定目标的文档,或者只是在将任务添加到队列时无法再动态指定目标。根据前面的文档查看下面描述的方法。

基于早期文档的方法

免责声明:我在这里提到的内容似乎是基于过时的信息(我在下面引用了来源),因此可能无法按预期工作和/或将来中断。

您可以使用Host标头指定将获取请求的模块、版本和实例信息。

要指定模块和版本,您可以执行以下操作:

Queue queue = QueueFactory.getQueue("QUEUE_NAME");
queue.add(TaskOptions.Builder
.withUrl("/url/path")
.param("key", "PARAM")
.header("Host",
ModulesServiceFactory.getModulesService().getVersionHostname("MODULE_NAME", "VERSION")));

要指定实例,您可以执行以下操作:

Queue queue = QueueFactory.getQueue("QUEUE_NAME");
queue.add(TaskOptions.Builder
.withUrl("/url/path")
.param("key", "PARAM")
.header("Host",
ModulesServiceFactory.getModulesService().getInstanceHostname("MODULE_NAME", "VERSION", "INSTANCE_NAME"));

我在当前版本的 App Engine 文档中找不到此信息,但使用 Wayback 机器,我从 2016 年 1 月 1 日的早期版本的文档中找到了此信息,该文档描述了推送任务的执行。在这个 github 问题中,它也在不同的上下文中进行了讨论。

推送任务执行

App Engine 通过向 .app。将编程异步回调指定为 HTTP 请求有时称为 Web 挂钩。Web 挂钩模型启用 高效的并行处理。

任务的 URL 确定任务的处理程序和模块 运行处理程序。

处理程序由 URL 的路径部分确定( 主机名后面的正斜杠分隔字符串),即 由包含在你对 Queue.add() 方法的调用。网址必须是相对的,并且 应用程序根目录的本地。

中的模块和版本 处理程序运行的由以下因素决定:

  • "主机"标头参数 在对 Queue.add() 的调用中包含的任务选项中 方法。
  • 队列.xml或队列 .yaml 文件中的目标指令。

如果未指定任何这些参数,则任务 将在排队的同一模块/版本中运行,主题 这些规则:

  • 如果应用的默认版本对任务进行排队,则任务将运行 在默认版本上。请注意,如果应用对任务进行排队,并且 默认版本在任务实际运行之前更改,任务 将在新的默认版本中执行。

  • 如果是非默认版本 对任务进行排队,该任务将始终在同一版本上运行。

注意: 如果将模块与调度文件一起使用,则任务的 URL 可能会 被截获并重新路由到另一个模块。

其中的命名空间 推送任务的运行是在将任务添加到队列时确定的。由 默认情况下,任务将在进程的当前命名空间中运行 创建了任务。您可以通过显式设置 将任务添加到队列之前的命名空间,如 多租户页面。

最新更新