【问题标题】:GAE Task Queue - Is there a way to delay a task from executing for X secondsGAE 任务队列 - 有没有办法延迟任务执行 X 秒
【发布时间】:2010-04-02 10:28:02
【问题描述】:
  • 有没有办法保证任务在 X 分钟内(或 X 分钟后)执行? (速率是指任务之间的间隔,但第一个任务呢,第一个任务会在“速率”时间之后开始吗?)

【问题讨论】:

  • 我更新了标题以代表所提出的实际问题。

标签: google-app-engine


【解决方案1】:

如果您的意思是“从现在起至少 X 分钟”,是的 - 使用 task queue API

【讨论】:

  • 你会想看看倒计时字段,这正是你想要的。
【解决方案2】:

在 PHP 中

$task = new PushTask(
    '/some/callback', 
    ['param1' => $param1, 'param2' => $param2, 'param3' => $param3],
    ['name'=>'EmailTask', 'method'=>'POST', 'delay_seconds'=>30]
);

或者更简单(默认是 POST)

$task = new PushTask(
    '/some/callback', 
    ['param1' => $param1, 'param2' => $param2, 'param3' => $param3],
    ['delay_seconds'=>30]
);
【解决方案3】:

根据@Peter Recore 的评论,add() 中的countdown 字段是“此任务应执行的未来时间(以秒为单位)。默认为零。”

文档: https://cloud.google.com/appengine/docs/python/refdocs/google.appengine.api.taskqueue

【讨论】:

    【解决方案4】:

    Google 已更新这部分 api (see here)。您现在可以使用包含以下选项的 PushTask 发送第三个参数:

    1. “方法”:字符串“POST”、“GET”、“HEAD”、“PUT”、“DELETE”之一。默认值:“POST”。
    2. 'name':字符串任务的名称。默认为 '' 表示服务将生成唯一的任务名称。
    3. 'delay_seconds': float 执行任务前等待的最短时间。默认值:零。
    4. 'header': string 任务执行时要发送的附加标头。

    【讨论】:

      【解决方案5】:

      使用任务队列 API

      public class Enqueue extends HttpServlet {
          private static final Logger log = Logger.getLogger(Enqueue.class.getName());
          protected void doPost(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
      
              String param1= request.getParameter("param1");
              String param2= request.getParameter("param2");
              String time = request.getParameter("time");
              int timer = Integer.parseInt(time) * 1000;//sec to millisec
              log.info("Executing in "+ timer+" seconds");
              // Add the task to the default queue.
              // Execute in 5 seconds
          Queue queue = QueueFactory.getDefaultQueue();
                  queue.add(TaskOptions.Builder.withUrl("/index1").param("param1", param1)
                          .param("param2", param2)
                          .countdownMillis(time));
      
              response.sendRedirect("/");
          }
      }
      

      现在在 Index1 类中定义作业

      public class Index1 extends HttpServlet {
          private static final Logger log = Logger.getLogger(Index1.class.getName());
      
          @Override
          public void doPost(HttpServletRequest req, HttpServletResponse resp)
                  throws IOException {
              String param1= req.getParameter("param1");
              String param2= req.getParameter("param2");
      
                  log.info("Worker processing " + param1);
      /*Define job to be executed*/
      
          }
          }   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-19
        • 2012-04-19
        • 2015-09-14
        • 1970-01-01
        • 2015-05-19
        • 1970-01-01
        • 2012-04-16
        • 2011-07-28
        相关资源
        最近更新 更多