簡體   English   中英

delayed_jobs保存已完成的工作

[英]delayed_jobs save completed jobs

是否有一個參數我可以傳遞給delayed_job,以防止它從delayed_jobs表中刪除已完成的作業?

有點像destroy_failed_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

由於我有一個以上的工作,我將成功方法掛鈎放在一個模塊中,並將其包含在我想要存儲的所有工作中。 (注意:有些不值得存放)

它似乎不是這樣。 來自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隨時間的處理速度,因為查找尚未完成的作業的查詢將不得不過濾掉那些有

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM