delayed_jobs保存已完成的工作

Ran*_*Ran 8 ruby-on-rails delayed-job

是否有一个参数我可以传递给delayed_job,这将阻止它从delayed_jobs表中删除已完成的作业?

有点像destroy_failed_jobs完成的工作

有任何想法吗?

jef*_*unt 7

看起来不是这样。来自自述文件:https : //github.com/tobi/delayed_job

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

您可能需要挂钩到它的 destroy 方法,以便它将作业复制到另一个单独的表,该表为您保留已完成的作业列表,或者简单地将哪些作业已完成记录到文件中,如果您只需要一个日志需要。

delayed_jobs出于几个原因,您不想将工作留在桌面上。首先,因为delayed_jobs使用该表作为待办事项列表 - 您希望它只是仍然需要完成的事情。其次,如果您修改它以将所有作业保留在同一个表中,那么该delayed_jobs表只会增长,这会delayed_jobs随着时间的推移减慢处理速度,因为查找尚未完成的作业的查询必须过滤掉那些有


nat*_*lds 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
Run Code Online (Sandbox Code Playgroud)

然后一个模块

class CompletedJob < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)

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

  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
Run Code Online (Sandbox Code Playgroud)

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