【发布时间】:2016-09-27 15:22:20
【问题描述】:
我希望仅在确认用户后才允许运行任务。我认为要做的事情可能是抛出异常并让 delay_job 堆栈重新排队任务,但我不知道这是否滥用了该功能。
鉴于此,如果尚未满足诸如用户确认之类的条件,是否有适当的方法来重新排队任务?
【问题讨论】:
标签: ruby-on-rails-3.2 delayed-job
我希望仅在确认用户后才允许运行任务。我认为要做的事情可能是抛出异常并让 delay_job 堆栈重新排队任务,但我不知道这是否滥用了该功能。
鉴于此,如果尚未满足诸如用户确认之类的条件,是否有适当的方法来重新排队任务?
【问题讨论】:
标签: ruby-on-rails-3.2 delayed-job
对此没有正确答案,这实际上取决于您要达到的目标。批处理(延迟作业)通常意味着在没有任何(或较少)人工干预的情况下处理平凡的任务。在选择“a”策略之前,您可能需要弄清楚某些事情:
1) 无故障处理所有实体对您的工作有多重要?
2) 您的用户体验会有多不方便?
3) 这个过程完全自主有多重要?
如果您的答案对于这三个问题中的任何一个都非常关键/重要,那么您可能需要采用下面的策略 #1。如果失败是可以容忍的,请选择#2。最后,如果您可以让人类来处理失败的实体,请选择 #3。
1) 延迟作业,创建一个失败队列,将失败的对象推入其中,并在一段时间后重试。
2) 只是简单地忽略失败,假设数据将在第二天再次运行之前修复。
3) 让您的工作向您(或系统管理员)报告任何故障,以便您干预并尝试缓解问题。
【讨论】:
我认为解决方案是 forcefully fail 您想要重新排队直到满足您的条件的作业。
要强制失败,您可以执行Delayed::Job.find_by_id(id).last 之类的操作。此条件将始终失败,因为 find_by_id 方法将获取单个记录。您可以将id 替换为其他任何内容。无论如何,你的目标是让那份工作失败。
【讨论】: