是否有可能获得appengine中前一个cron的详细信息?

时间:2015-06-11 09:33:58

标签: java google-app-engine cron

我在appengine中有一个cron作业,如果根据条目的创建时间在特定表中创建任何新条目,则每5分钟运行一次以检入数据存储区。由于我不想两次报告该条目,我有以下内容:

我在db中查询已创建的条目(CurrentTime,currentTime - 5min)。这应该有效,并且在大多数情况下都有效。

问题是cron几乎不会报告少数条目。发生这种情况是因为前一个cron的(currentTime - 5)和下一个cron的currentTime不同,并且存在轻微的毫秒变化。因此,如果在此插槽中创建了一个条目,则不会报告该条目。

我试图绕过这个问题。一个解决方法我在我的查询中寻找6分钟,这将确保没有错过任何条目,但我可能需要处理重复项,这对我来说是另一项任务。 我也可以在db或某个地方存储前一个cron执行的时间,并根据我可以查询,但差异可能会在某些时候加起来导致延迟。

请对如何实现这一目标提出任何建议。

2 个答案:

答案 0 :(得分:0)

我有两点建议:

  1. 为每个条目添加布尔标志,以标记是否已报告。因此,如果已报告相应的条目,则必须设置它。

  2. 以避免额外的写访问缓冲您已经报告的条目的密钥,以便cron作业可以访问它们,查询cron作业中的最后6分钟并检查如果每个条目的密钥都在缓冲区中,则为每个条目。

  3. 在写入数据存储区时,可能第三种选择可能是报告内容?

答案 1 :(得分:0)

写入条目后,通过id获取写入的最后一个,并将其时间戳保存到db(并将其缓存在memcache中)。在下一个cron查询中使用此时间戳。

要避免按键获取(因此如果使用异步写入时速度较慢),您可以编写自己的时间戳,并使用您已知的那个,而不会在写入后获取实体。缺点是现在需要更多的存储空间并需要更多的索引。

为了避免修改数据库,只需执行您所说的有关查询最后6分钟的内容。如果你设置了自己的密钥名称,那么你可以只存储最后一个密钥,然后跳到那里。但是你需要处理棘手的情况,因为某些原因导致最后一个cron无法运行,因此你不会在过去的6分钟内找到最后写的权利。