如何在Google App Engine中使用模块并使用任务队列(Java)为其添加目标?

我的任务超过了任务队列超过10分钟的截止日期。 通过不同的文档,我发现使用模块我可以运行一个实例来处理长时间运行的任务,但最好甚至应该使用任务队列来完成。 我曾经使用过后端,但是他们已被弃用了。

我的问题是如何将模块引入现有的App Engine项目中,如何使用它们来运行长时间运行的任务?

以下是一段代码:

Queue queue = QueueFactory.getQueue("myqueue"); TaskOptions task = TaskOptions.Builder.withUrl("/submitworker").method(Method.POST); queue.add(task); 

在上面的代码中我需要做些什么更改才能使用模块添加长时间运行的任务? [“submitworker”是一个servlet,它是实际的长期运行任务]

我已经提到了这个链接,但我无法绕过第三步:
3.将服务声明元素添加到appengine-application.xml文件中。

此外,即使我成功地将模块添加到我的项目中,如何使用任务队列来定位此模块?

我已经解决了这个问题,但它是一个python实现,我的实现是用Java实现的。

我正在寻找一个循序渐进的过程,如何在模块中使用“目标”以及如何在添加到任务队列时使用它。

即使我将长时间运行的模块目标添加到任务队列,仍然会在10分钟后终止执行,或者即使任务队列中的任务到期,它还是会完成任务吗?

请建议。

模块和服务是一回事,它们与旧的后端类似(它们仍然有效,但已被弃用)。

使模块工作有两种基本方法:

  • 创建一个EAR并进行部署
  • 作为WAR文件独立部署服务(这可能是您现在正在对默认模块执行的操作)

第二个选项可能更容易,因为它只是更改application-web.xml的问题。 您可以为每个模块设置一个repo或branch,或者只是一个更改您要定位的模块的构建过程。

现在你的application-web.xml可能有这样的东西:

 @appId@ @appVersion@ default 

把它改成这样的东西

 @appId@ @appVersion@ long-running-service B1  1  

您将队列本身配置为以queue.xml的特定模块为目标。请参见此处 。

免责声明:答案完全基于docs(我实际上使用python – 相同的概念,但不同的配置)。

要使服务/模块允许长时间运行的任务,您必须将其配置为基本或手动扩展。 从Scaling类型和实例类 (表中的Deadline行):

  • Manual scaling列中:

请求可以无限期运行。 手动扩展的实例可以选择处理/ _ah /启动并执行程序或脚本数小时而不返回HTTP响应代码。 任务最长可达24小时。

  • Basic scaling列中:

与手动缩放相同。

通过相应模块的appengine-web.xml文件完成的模块缩放配置在Scaling元素中描述:

可选的。 该元素支持模块的手动缩放,并设置模块的实例数。

可选的。 该元素设置模块的实例数。

至于实际转换为模块,补充您使用配置文件 (包括示例 )和appengine-web.xml语法指向的指南(请参阅moduleservice配置)。

关于appengine-application.xml ,来自配置文件 :

META-INF目录有两个配置文件: appengine-application.xmlapplication.xmlappengine-application.xml文件包含部署应用程序时App Engine工具使用的常规信息…

请注意,虽然每个appengine-web.xml文件都必须包含标记,但您在其中提供的名称将被忽略。 应用程序的名称取自appengine-application.xml文件中的标记。

要将某个队列定向到某个服务/模块,请使用queue.xml文件。 从语法 :

  • (推送队列):

可选的。 命名模块/版本,前端版本或后端的字符串,用于执行排队到此队列的所有任务。

在构造任务的HTTP请求时,该字符串将添加到应用程序的域名之前。 例如,如果您的应用程序ID是my-app并且您将目标设置为my-version.my-service ,则URL主机名将设置为my-version.my-service.my-app.appspot.com

如果未指定target,则在它们入队的应用程序的同一版本上调用任务。 因此,如果您在默认应用程序版本中排队任务而未在队列上指定目标,则会在默认应用程序版本中调用该任务。 请注意,如果默认应用程序版本在任务排队的时间和执行时间之间发生变化,则任务将以新的默认版本运行。

如果您正在使用模块和调度文件 ,则可能会拦截您的任务的HTTP请求并将其重新路由到另一个模块。

Interesting Posts