【问题标题】:How to identify whether task exists already within GAE pull queue?如何识别任务是否已存在于 GAE 拉取队列中?
【发布时间】:2015-09-23 13:30:46
【问题描述】:

在将任务添加到拉取队列之前,我必须确认队列中是否已经存在相同的任务,如果存在应该跳过任务添加到队列。添加带有名称的任务对我不起作用,因为它直到队列中的 7 天才过期,甚至被删除。

我们可以使用REST API 列出任务。同理,我们能否在GAE模块中获取任务列表,或者有没有其他方法可以在Google App Engine模块中查找任务是否存在于队列中?

谢谢

【问题讨论】:

  • 我不完全理解(您没有解释)您不能只使用名​​称和 REST API 的原因...?
  • 嗨尼克,根据我的要求,类似通知之类的任务会出现一段时间(例如 5 分钟)。因此,为避免重复通知,需要在该持续时间内(即 5 分钟内)发送先到先服务方式。因此,需要在该持续时间内运行独特的任务。
  • 你能详细解释一下"Adding task with name doesn't work for me as it doesn't expire until seven days from the queue even deleted"的意思吗?
  • 另外,"can we get the list of tasks within GAE module or is there any other way to find whether task exists in the queue within Google App Engine module?" 是什么意思?

标签: java google-app-engine pull-queue


【解决方案1】:

如果任务名称不适用于您的应用程序的逻辑,您可以创建一个相应的数据库实体(空,只是一个键),作为任务在队列中的标志。您应该将它与任务一起放入事务中,并在任务完成时将其删除。

每个任务将花费您 1 次读取和 4 次写入(2 次插入和 2 次删除)操作 - 没有什么是免费的。

作为替代方案,您可以考虑在您的业务实体中设置一些计数器,作为任务名称的一部分。

假设您有实体 User 和属性 TaskCounter。

然后您将添加任务为:

tasks.add(taskName="TASKNAME" + str(user.id) + str(user.TaskCounter)) - 这将确保每个实体只有 1 个活动任务。当然,您需要在任务完成时更新属性。如果您无论如何更新任务中的实体,几乎不会花费您任何费用。

【讨论】:

  • 感谢亚历山大的回答。我之前考虑过使用 Memcache 而不是 db,因为它也包含实体的过期时间。
  • Memcache 可以工作,但不能保证保值。因此,不能保证您不会多次插入任务。它应该大部分时间都可以工作,但是您应该使您的任务独立(能够使用相同的参数多次运行而不会破坏业务逻辑)。如果我的回答令人满意,您可以将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多