1

我正在尝试在未来一个小时内运行一项任务。这是我正在做的,似乎不起作用。

import static com.google.appengine.api.taskqueue.TaskOptions.Builder.*;


Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date()); 
cal.add(Calendar.HOUR, 1); 
cal.getTime(); 

Queue queue = QueueFactory.getDefaultQueue();
queue.add(withUrl("/task/doMyThing").param("userId", userId).header("X-AppEngine-TaskETA", cal.getTime().getTime()+""));

-编辑

好的,然后再澄清一点:当有人点击我的服务时,我想在他们点击服务一小时后调用一个 Java 方法。我认为任务队列是在 App Engine 上执行此操作的最佳方式。我认为除非 ETA 通过,否则队列不会执行该任务。如果我以错误的方式处理这个问题并且有更好的方法来完成它,请告诉我。

- 再次编辑

感谢您的回答,为了记录,这就是我所做的:

Queue queue = QueueFactory.getDefaultQueue();
queue.add(withUrl("/task/sendReminder").param("userId", userId).countdownMillis(120000));
4

3 回答 3

3

我已经完成了您想要做的事情,但是在 python 中。我认为您尝试设置的标题是 appengine 在从队列中启动任务时设置的标题,而不一定是您在创建任务时设置的标题。我认为您正在寻找值为 3600000的countdownMillis 。

于 2013-06-06T02:11:57.913 回答
0

我会看看DelayQueue。我会让一个线程DelayQueue连续地拉出对象并将它们交给缓存的线程池以尽快执行它们,而不是使用Timer.

DelayQueue将阻塞,直到下一个项目的等待期到期。您可以通过在将对象添加到队列之前设置它们的延迟时间来控制何时可以从队列中删除对象,以确保它们在队列中停留很长时间。

使用缓存线程池将确保每个任务在离开队列后立即执行,并通过重用线程而不是每次任务从队列中拉出时初始化新线程来最小化初始化时间/空间。

于 2013-06-05T22:35:41.980 回答
0

java Timer Class是要研究的。
如果您想在一小时后执行任务,但正如您提到
的“未来一小时的任务”似乎不清楚

于 2013-06-05T20:55:58.277 回答