delayed_jobs保存已完成的工作

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

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

有任何想法吗?

它似乎不是这样。 来自README: https : //github.com/tobi/delayed_job

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

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

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

扩展@ 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 

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

你可以使用类似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