【问题标题】:Is there a way to requeue a delayed job task if a condition isn't met?如果不满足条件,有没有办法重新排队延迟的作业任务?
【发布时间】:2016-09-27 15:22:20
【问题描述】:

我希望仅在确认用户后才允许运行任务。我认为要做的事情可能是抛出异常并让 delay_job 堆栈重新排队任务,但我不知道这是否滥用了该功能。

鉴于此,如果尚未满足诸如用户确认之类的条件,是否有适当的方法来重新排队任务?

【问题讨论】:

    标签: ruby-on-rails-3.2 delayed-job


    【解决方案1】:

    对此没有正确答案,这实际上取决于您要达到的目标。批处理(延迟作业)通常意味着在没有任何(或较少)人工干预的情况下处理平凡的任务。在选择“a”策略之前,您可能需要弄清楚某些事情:

    1) 无故障处理所有实体对您的工作有多重要?

    2) 您的用户体验会有多不方便?

    3) 这个过程完全自主有多重要?

    如果您的答案对于这三个问题中的任何一个都非常关键/重要,那么您可能需要采用下面的策略 #1。如果失败是可以容忍的,请选择#2。最后,如果您可以让人类来处理失败的实体,请选择 #3。

    1) 延迟作业,创建一个失败队列,将失败的对象推入其中,并在一段时间后重试。

    2) 只是简单地忽略失败,假设数据将在第二天再次运行之前修复。

    3) 让您的工作向您(或系统管理员)报告任何故障,以便您干预并尝试缓解问题。

    【讨论】:

    • 感谢您的回答。我将选择#2,看看命中率是多少,以确定我是否必须选择#1
    【解决方案2】:

    我认为解决方案是 forcefully fail 您想要重新排队直到满足您的条件的作业。

    要强制失败,您可以执行Delayed::Job.find_by_id(id).last 之类的操作。此条件将始终失败,因为 find_by_id 方法将获取单个记录。您可以将id 替换为其他任何内容。无论如何,你的目标是让那份工作失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2016-03-29
      • 2017-12-02
      • 2019-03-13
      • 1970-01-01
      相关资源
      最近更新 更多