【问题标题】:Google Appengine: How to schedule a task to run once at a time of the dayGoogle Appengine:如何安排任务在一天中的某个时间运行一次
【发布时间】:2017-05-03 23:23:15
【问题描述】:
我遇到的情况是,我希望用户执行某项操作并且可以选择在接下来的 24 小时之前恢复该操作,否则该操作将被执行。我能想出的唯一解决方案是使用 Cron 作业 并将其安排在一天中的特定时间,在作业中我会检查他们预定时间已过的所有操作然后执行它们。但是该操作不会经常发生,因此运行 Cron 作业对我来说似乎不是一个好的解决方案,因为我什至不确定成本影响。
我想要做的是,每当用户单击操作时,都应该安排一个作业,一旦执行该操作,就应该取消该计划。是否可以使用 Cron Job 做到这一点?如果没有,GAE 提供什么替代方案?
【问题讨论】:
标签:
google-app-engine
cron
【解决方案1】:
从配额/计费的角度来看,当一个请求由 cron 作业调度时,它会作为一个普通请求处理。我想您的应用程序每天会收到更多的请求,所以加一个请求应该不是问题,除非您的应用程序非常重量级。
我更喜欢 cron 而不是延迟任务,因为后者更复杂。一个 cron 作业很可能会查询数据存储然后做某事或不做某事。跟踪或管理数据存储的状态比跟踪延迟任务更容易。
【解决方案2】:
你有两个选择:
(1) 每小时运行一次 cron 作业(例如)。执行创建时间超过 24 小时的所有操作。
(2) 存储动作时,使用DeferredTask API 创建任务。给这个任务一个名字(例如一个动作的 ID),以防你需要取消它。将此任务添加到延迟 24 小时的队列中。 Java 示例:
Queue queue = QueueFactory.getDefaultQueue();
// Wait 24 hours to run
queue.add(TaskOptions.Builder.withPayload(new MyTask())
.name(taskName).etaMillis(System.currentTimeMillis() + (24 * 60 * 60 * 1000));