delayed_jobs保存已完成的工作

时间:2011-09-15 13:48:07

标签: ruby-on-rails delayed-job

我可以传递给delayed_job的参数是否会阻止它从delayed_jobs表中删除已完成的作业?

有点像destroy_failed_jobs,但对于已完成的工作

任何想法?

3 个答案:

答案 0 :(得分:6)

扩展@ jefflunt的答案。

我添加了一个迁移来创建一个包含已完成作业的表

class CreateCompletedJobs < ActiveRecord::Migration
  def change
    create_table :completed_jobs do |t|
      t.integer  "priority", :default => 0
      t.integer  "attempts", :default => 0
      t.text     "handler", :limit => 2147483647
      t.datetime "run_at"
      t.datetime "completed_at"
      t.string   "queue"
      t.timestamps
    end
  end
end

然后一个模块

class CompletedJob < ActiveRecord::Base
end

最后将挂钩添加到我想要存储的作业

  def success job
    save_completed_job job
  end

  private

  def save_completed_job job
    CompletedJob.create({
      priority: job.priority,
      attempts: job.attempts,
      handler: job.handler,
      run_at: job.run_at,
      completed_at: DateTime.now,
      queue: job.queue
    })
  end

由于我有一个以上的工作,我将成功方法挂钩放在一个模块中,并将其包含在我想要存储的所有工作中。 (注意:有些不值得存储)

答案 1 :(得分:4)

它不会出现。来自自述文件:https://github.com/tobi/delayed_job

  

默认情况下,它会删除失败的作业(并且它总是会删除   成功的工作)。如果要保留失败的作业,请设置   延迟:: Job.destroy_failed_jobs = false。失败的工作将是   标有非null failed_at。

您可能需要挂钩其destroy方法,以便将作业复制到另一个单独的表,该表为您保留已完成作业的列表,或者只是记录已对文件执行的作业,如果是日志就是你所需要的一切。

您不想要的是将作业留在delayed_jobs表中,原因有两个。首先,因为delayed_jobs使用该表作为TODO列表 - 您希望它只是仍然需要完成的事情。其次,如果你攻击它以将所有作业保留在同一个表中,那么delayed_jobs表只会增长,这将减慢delayed_jobs随时间的处理速度,作为查找具有<的作业的查询strong>尚未已完成,必须过滤掉那些

答案 2 :(得分:0)

您可以使用类似acts_as_paranoid的内容。

它基本上是这样的:

  • #destroy 被覆盖,因此不会从数据库中删除记录,而是设置deleted_at时间戳
  • 安装了默认范围,以便 .find (及其所有变体)不会从设置了deleted_at时间戳的数据库中返回项目

以下是介绍:http://technicalpickles.com/posts/embracing-your-paranoia-with-acts_as_paranoid/

注意:acts_as_paranoid很老,可能有更好的解决方案,所以请查看https://www.ruby-toolbox.com/categories/Active_Record_Soft_Delete