每隔n秒钟在Google App Engine中运行一次Java函数

时间:2018-06-22 04:58:11

标签: java google-app-engine google-cloud-platform

Google App Engine每5秒运行一次特定功能的最佳方法是什么(这需要插入数据库)?

4 个答案:

答案 0 :(得分:1)

您可以使用cron https://cloud.google.com/appengine/docs/standard/python/config/cronref

我认为最快的计划是每5分钟执行一次,但是5分钟的任务可能会将一堆任务添加到交错的任务队列中,每5秒启动一次。

cron.yaml

cron:
- description: "task name"
  url: /do-thing
  schedule: every 5 minutes

请求处理程序

from google.appengine.ext.deferred import deferred

def do_thing():
    pass

# request handler for "/do-thing"
class CronRequestHandler(webapp2.RequestHandler):
    def get(self):
        for seconds in xrange(0,300,5):  # 0, 5, 10, ... 295]
            deferred.defer(do_thing, _countdown=seconds)

您还可以有一个专用的手动缩放实例,它执行以下操作:

import time

# request handler for '/_ah/start'
class Start(webapp2.RequestHandler):

    def get(self):
        while True:
            time.sleep(5)
            do_thing()

答案 1 :(得分:1)

您可以通过cron结合一点点代码来做到这一点。

cron的最小间隔为1分钟。您要做的是每1分钟调用一次cron作业,并在cron作业中睡眠5秒钟,然后调用12次函数12次。

cron.xml

<cronentries>
  <cron>
    <url>/path/to/your/job</url>
    <description>your job</description>
    <schedule>every 1 minutes</schedule>
  </cron>
</cronentries>

yourcronjob.java

public class YourCronJob extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
        for (int i=0; i<12; i++) {
            yourFunction();
            Thread.sleep(5000);
        }
    }
}

答案 2 :(得分:1)

为避免在请求处理程序中休眠(通常这不是GAE的好用),您可以使用延迟5秒的自入队列请求队列:

  • 当收到任务请求时,任务处理程序将首先排队另一个推迟的任务(它将在下一次迭代中执行),然后继续实际执行当前要完成的工作
  • 您可以使用cron作业来创建并入队第一个此类任务(或由于某种原因而中断自生成任务序列后),然后每个任务都将排入下一个任务
  • 您需要禁用自动重试任务-以防止意外结束多组自生成任务,这些任务将同时运行,使您在执行之间的间隔少于5s。

或者,您可以使用1分钟的cron作业来排队12个单独的推送任务:

  • 第一个没有延迟
  • 随后的每一个延迟,延迟时间会逐渐延长5s

与上面的方法相比,这将产生更精确的定时,因为排队之间的延迟不会复杂化。

不确定Java运行时是否通过指定绝对执行时间而不是仅指定增量延迟来创建延迟的任务,如果这样的话,这可能是更好的方法,同时具有更精确的时间安排:这12个中的每个绝对执行时间可以根据当前cron作业的时间精确地计算任务,并且精确到分钟,这也可以最大程度地减少cron执行时间偏斜的影响。

答案 3 :(得分:0)

Google应用程序引擎提供了一个称为Cron的调度程序功能,可以在指定的时间间隔内运行重复的任务。这些任务通常称为cron作业。这些cron作业由App Engine Cron服务自动触发。例如,您可以使用cron作业每天发送一次电子邮件报告,或者每10分钟更新一些缓存的数据,或者每小时刷新一次摘要信息。

在您的情况下,您可以创建一个REST操作,以将新记录插入数据库。并且可以通过URL访问此REST操作。然后,您可以创建一个cron服务,该服务将在指定的时间段内运行,并通过REST URL调用其余的插入操作。

有关更多信息,请参阅https://cloud.google.com/appengine/docs/standard/java/config/cron