在Google App Engine中每n秒运行一次java函数

在Google App Engine中每n秒运行一次java函数,java,google-app-engine,google-cloud-platform,Java,Google App Engine,Google Cloud Platform,在Google App Engine中,每5秒运行一次特定功能(需要插入数据库)的最佳方式是什么?您可以使用cron 我认为最快的时间表可以是每5分钟一次,但这5分钟的任务可能会将大量任务添加到任务队列中,每5秒启动一次 克朗·亚姆 cron: - description: "task name" url: /do-thing schedule: every 5 minutes 请求处理程序 from google.appengine.ext.deferred import defer

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

您可以使用cron

我认为最快的时间表可以是每5分钟一次,但这5分钟的任务可能会将大量任务添加到任务队列中,每5秒启动一次

克朗·亚姆

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()
你可以用cron

我认为最快的时间表可以是每5分钟一次,但这5分钟的任务可能会将大量任务添加到任务队列中,每5秒启动一次

克朗·亚姆

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()
您可以通过结合一些位代码来实现这一点

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

cron.xml

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

/路径/到/您的/工作
你的工作
每1分钟
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);
        }
    }
}
public类YourCronJob扩展了HttpServlet{
@凌驾
public void doGet(HttpServletRequest-req、HttpServletResponse-res)抛出IOException{
对于(inti=0;i您可以通过结合一点位代码来实现

cron的最小间隔是1分钟。您需要做的是每1分钟调用一个cron作业,并在cron作业内睡眠5秒的情况下调用您的函数12次

cron.xml

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

/路径/到/您的/工作
你的工作
每1分钟
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);
        }
    }
}
public类YourCronJob扩展了HttpServlet{
@凌驾
public void doGet(HttpServletRequest-req、HttpServletResponse-res)抛出IOException{

对于(int i=0;iGoogle app engine提供了一个名为Cron的调度程序功能,可在指定的时间间隔内运行重复的任务。这些任务通常称为Cron作业。这些Cron作业由app engine Cron服务自动触发。例如,您可以使用Cron作业每天发送电子邮件报告,或更新ome每10分钟缓存一次数据,或每小时刷新一次摘要信息

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


有关详细信息,请参阅。

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

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


有关更多信息,请参阅。

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

  • 当接收到任务请求时,任务处理程序将首先将另一个延迟的任务(将是在下一次迭代中执行的任务)排入队列,然后继续实际执行当前时间要完成的工作
  • 您可以使用cron作业创建第一个这样的任务并将其排队(或者在自生成的任务序列因任何原因中断之后),之后每个任务将负责将后续任务排队
  • 您需要禁用自动任务重试-以防止意外地导致多组自动生成的任务同时运行,执行间隔少于5秒
或者,您可以使用1分钟的cron作业将12个单独的推送任务排队:

  • 第一个毫不拖延
  • 随后的每一次延迟都会逐渐延长
这将产生比上述方法更精确的计时,因为排队之间的延迟不会复合


不确定Java运行时是否允许通过指定绝对执行时间而不仅仅是增量延迟来创建延迟任务,如果允许的话,这可能是一种更好的方法,同样具有更精确的计时:12个任务中的每个任务的绝对执行时间都可以基于当前cron作业的时间精确计算,精确到分钟ich还可以将cron执行时间偏差的影响降至最低。

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

  • 当接收到任务请求时,任务处理程序将首先将另一个延迟的任务(将是在下一次迭代中执行的任务)排入队列,然后继续实际执行当前时间要完成的工作
  • 您可以使用cron作业创建第一个这样的任务并将其排队(或者在自生成的任务序列因任何原因中断之后),之后每个任务将负责将后续任务排队
  • 您需要禁用自动任务重试-以防止意外地导致多组自动生成的任务同时运行,执行间隔少于5秒
或者,您可以使用1分钟的cron作业将12个单独的推送任务排队: