我可以传递给delayed_job的参数是否会阻止它从delayed_jobs表中删除已完成的作业?
有点像destroy_failed_jobs
,但对于已完成的工作
任何想法?
答案 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的内容。
它基本上是这样的:
以下是介绍:http://technicalpickles.com/posts/embracing-your-paranoia-with-acts_as_paranoid/
注意:acts_as_paranoid很老,可能有更好的解决方案,所以请查看https://www.ruby-toolbox.com/categories/Active_Record_Soft_Delete