Java 如何在GAE上进行响应后处理

Java 如何在GAE上进行响应后处理,java,google-app-engine,Java,Google App Engine,我有一个运行在GAE上的Java服务器来支持Android应用程序 当应用程序启动时,它会向服务器发出请求-该请求应尽快返回。该请求还应该触发几秒钟的二次处理——二次处理,因为响应不需要它,所以我希望它在请求完成后发生 以下是我正在考虑的方法: 最明显的解决方案是应用程序在第一个请求完成时执行第二个请求。这似乎相当浪费,因为通常没有数据可发送或接收。如果二次处理确实为客户机生成一些额外数据(20%),那么既然GCM支持有效负载,我也可以通过GCM发送数据 听起来很完美,但由于它们是在任务队列之

我有一个运行在GAE上的Java服务器来支持Android应用程序

当应用程序启动时,它会向服务器发出请求-该请求应尽快返回。该请求还应该触发几秒钟的二次处理——二次处理,因为响应不需要它,所以我希望它在请求完成后发生

以下是我正在考虑的方法:

  • 最明显的解决方案是应用程序在第一个请求完成时执行第二个请求。这似乎相当浪费,因为通常没有数据可发送或接收。如果二次处理确实为客户机生成一些额外数据(20%),那么既然GCM支持有效负载,我也可以通过GCM发送数据

  • 听起来很完美,但由于它们是在任务队列之上实现的,我想它们与任务队列面临同样的问题

  • 听起来也很合适,但一点阅读表明,他们的时间是高度可变的-往往有相当大的延迟。如上所述,在20%的情况下,我的二次处理将产生一些额外的数据发送到客户端,并显示给用户。
    如果我的任务在10秒内执行,80%的时间,那就可以了,但听起来情况并非如此。[编辑:抱歉,我并不是说剩下的20%无关紧要-我仍然希望它们发生在20-30秒内,例如,当用户仍在应用程序中时。]

是否有某种方法可以配置我的应用程序,使推送任务队列获得合理的高优先级,而不会产生不必要的成本

  • 异步Url获取。在我看来,如果我在完成初始请求之前对自己的一个url进行异步url获取,那么这将达到我的目的。我能想到的主要负面因素是,这可能会导致GAE启动我的应用程序的新实例,因为它试图在初始请求完成之前处理新请求。为了效率和成本,我宁愿让我的二次处理与我的初始请求同步进行

  • 线程不是AFAIK的选项。在我的请求处理程序中生成的线程不能超过请求处理程序本身的生命周期

那么,这些选项(或其他选项)中哪一个最适合我的目的呢?

将这一个加上星号:

不能使用后台线程/线程:static java.util.concurrent.ThreadFactory backgroundThreadFactory() 返回一个ThreadFactory,该ThreadFactory将创建独立于当前请求的线程

从文档中:

将此项标记为星形:

不能使用后台线程/线程:static java.util.concurrent.ThreadFactory backgroundThreadFactory() 返回一个ThreadFactory,该ThreadFactory将创建独立于当前请求的线程


从文档中可以看出:

任务队列最适合您在app engine上的用途。我认为满足您所有需求的唯一其他方法是使用您自己的服务器,或者类似于EC2/GCE的东西


异步url获取有风险,因为如果由于某种原因失败,将不会重新提交。可以高速配置任务队列,从而降低任务调度时间过长的风险。线程不是选项:当请求完成时,不能从中提交任何RPC(即,如果在请求完成后有另一个线程运行,该线程将无法执行任何有用的操作)。

任务队列最适合您在app engine上的用途。我认为满足您所有需求的唯一其他方法是使用您自己的服务器,或者类似于EC2/GCE的东西


异步url获取有风险,因为如果由于某种原因失败,将不会重新提交。可以高速配置任务队列,从而降低任务调度时间过长的风险。线程不是一个选项:当请求完成时,不能从中提交任何RPC(即,如果在请求完成后运行另一个线程,该线程将无法执行任何有用的操作)。

任务队列是获得所需后台处理的最佳方式。关于长时间执行延迟的报道有些夸张。您可以查看(单击任务队列图标)以查看它是否符合您的要求

在过去几天中,它显示任务通常在300毫秒内执行。目测数据表明,大约90%的任务在3秒内执行


偶尔会有延迟,但对于“响应不需要”的数据,我发现Taskqueues工作得很好。

Taskqueues是获得所需后台处理的最佳方式。关于长时间执行延迟的报道有些夸张。您可以查看(单击任务队列图标)以查看它是否符合您的要求

在过去几天中,它显示任务通常在300毫秒内执行。目测数据表明,大约90%的任务在3秒内执行


偶尔会有延迟,但对于“响应不需要”的数据,我发现Taskqueues工作得很好。

不,线程不是一个选项。线程不允许超过请求的生命周期。我会更新我的问题来解决这个问题。但是谢谢你的建议,我会让这个问题成为明星。但是你可以使用后端(线程):是的,但是后端听起来非常繁重(而且相当昂贵)。不,线程不是一个选项。线程不允许超过请求的生命周期。我会更新我的问题来解决这个问题。但是谢谢你的建议,我会发布这个问题。但是你可以使用一个后端(线程):是的,但是后端听起来非常繁重(而且相当昂贵)。请阅读voscausa提到的问题链接。使用任务队列参数来配置高吞吐量TQ不会影响性能