【发布时间】:2010-04-02 10:28:02
【问题描述】:
- 有没有办法保证任务在 X 分钟内(或 X 分钟后)执行? (速率是指任务之间的间隔,但第一个任务呢,第一个任务会在“速率”时间之后开始吗?)
【问题讨论】:
-
我更新了标题以代表所提出的实际问题。
【问题讨论】:
如果您的意思是“从现在起至少 X 分钟”,是的 - 使用 task queue API。
【讨论】:
在 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]
);
根据@Peter Recore 的评论,add() 中的countdown 字段是“此任务应执行的未来时间(以秒为单位)。默认为零。”
文档: https://cloud.google.com/appengine/docs/python/refdocs/google.appengine.api.taskqueue
【讨论】:
Google 已更新这部分 api (see here)。您现在可以使用包含以下选项的 PushTask 发送第三个参数:
【讨论】:
使用任务队列 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*/
}
}
【讨论】: