【问题标题】:Destroying all delayed job in rails销毁 Rails 中所有延迟的工作
【发布时间】:2012-03-29 19:06:03
【问题描述】:

我正在为 rails 2.3.8 使用collectiveidea。我正在创建一系列延迟的工作 执行一些任务,一段时间后我想销毁所有正在运行的延迟作业。 如果有人知道如何做到这一点,请帮助我。

【问题讨论】:

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


    【解决方案1】:

    您可以调用rake jobs:clear 删除队列中的所有作业。

    【讨论】:

    • 这不符合 OP 的要求。他试图杀死正在运行的作业,而不是清除队列。
    • 我有一个正在运行的工作(它将挂起两个小时),在运行 rake jobs:clear 之后,工作人员也停止了该特定工作。
    • OP 想知道如何从应用程序端(而不是终端)从队列中删除作业,所以这确实不能回答他/她的问题。不过,从赞成票看来,人们正在为后者提出这个问题。
    【解决方案2】:

    听起来您有一个父进程,如果其作业集未在特定时间内完成,则该进程希望超时。与其挂在作业本身的引用上,不如在模型上设置一个标志,表明该过程已放弃。如果不再需要,作业可以检查该标志和短路。 (您的 Job 类还应该在超时中包装其 #perform 方法的内容。)

    按照您的建议,尝试坚持对 DJ 对象的引用几乎总是一个坏主意。

    【讨论】:

      【解决方案3】:

      除了 rake 任务,DelayedJob 作业只是一个普通的 ActiveRecord 模型,所以如果您使用 Ruby 代码,您可以对它们做您喜欢的事情:

      Delayed::Job.destroy_all
      Delayed::Job.delete_all
      Delayed::Job.find(4).destroy
      # etc.
      

      【讨论】:

      • 你能详细说明Delayed::Job.find(4).destroy
      • @clickit 它会破坏 ID 为 4 的延迟作业。
      • destroydelete有区别吗?
      • destroy 将处理 Rails 定义的任何回调 - 特别是,它将清除您设置了 dependent: destroydepdendent: nullify 的任何关联。 delete 只是从数据库中删除记录。一般来说,除非您有充分的理由,否则请始终使用 destroy 而不是 delete
      • 另外,Delayed::Job.find(id).locked_by 会在显示的字符串中为您提供一个 PID,例如:“host:Your-Host.local pid:6899”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2011-05-06
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多