美好的一天,
我正在作为应用引擎(Java)运行应用程序的后端。 使用端点,我收到请求。问题是,我需要计算一些大的东西,但我需要前端的快速响应时间。因此,作为一种解决方案,我想预先计算一些内容,并将其存储为专用的内存缓存。
我这样做的方法是添加静态块,然后在默认队列上运行延迟任务。 是否有更好的方法可以在启动时计算某些内容?
现在,此延迟任务执行大量数据存储操作。有时,他们会超时。所以我创建了一个系统,它在超时时重试,直到成功为止。但是,当我启动应用程序引擎时,它会立即创建两个延迟任务。尽管我设置了DeferredTaskContext.setDoNotRetry(true);.
它还会在失败时继续重试任务。老实说,延期任务感觉非常挑剔。
我只想运行一个大于5分钟的方法(数据集增长时可能会更长)。我希望在启动时运行此方法,然后定期运行。您将如何建模?我的第一个想法是一个cron工作,但他们的时间有限。我需要一个运行延期任务的cron作业,希望它们不会以某种方式堆积或生成重复项或开始重试。
感谢您的帮助和美好的一天。
晾
答案 0 :(得分:1)
您的数据存储区操作永远不会超时。您需要通过使用游标并为大型查询设置正确的批量大小来解决此问题。
您可以执行initialization of objects on instance startup - 检查对象是否可用,如果没有 - 进行计算。
请记住将计算结果存储在数据存储区(除Memcache之外),因为Memcache是易失性的。这样,如果因任何原因删除了Memcache对象,则无需在第一次计算完成后几秒重新计算所有内容。
可以安排延迟任务在指定的延迟后执行。因此,您可以创建一个在1小时后执行的任务(例如),而不是使用cron作业。这项任务在完成自己的计算后,可以创建另一项任务,在一小时后激发,依此类推。