试图理解Rails中的delayed_job,我想更新我的图库中所有已经过期的PIN。
class UpdatePinJob < ApplicationJob
queue_as :default
def perform(gallery)
gallery.where('DATE(expired_pin) > ?', Date.today).update_all('pin = ?', 'new_pin_here')
end
end
我希望我的问题是有意义的,为什么我在这种情况下使用一个队列,因为我在想如果我的画廊有成千上万的,我想更新所有的,这是我在想使用延迟_job可能会帮助这个规模:)如果我的问题有什么错误,对不起,我在这里试图了解。
你的方向是对的。我建议你按照这里的说明去做。ActiveJobsBasics
要在你的控制器中调用它,你应该这样做。
# Enqueue a job to be performed as soon as the queuing system is free.
UpdatePinJob.perform_later(gallery)
# Enqueue a job to be performed 1 week from now.
UpdatePinJob.set(wait: 1.week).perform_later(gallery)
一个重要的事情,你应该注意的是关于实际执行工作。根据ActiveJob:
为了在生产过程中执行作业,你需要建立一个排队后端,也就是说,你需要决定Rails应该使用的第三方排队库。Rails本身只提供了一个进程内排队系统,它只将作业保存在RAM中。如果进程崩溃或者机器被重置,那么所有未完成的作业都会在默认的async后台丢失。这对于较小的应用程序或非关键性作业来说可能是好的,但大多数生产应用程序将需要选择一个持久的后端。
我会选择 Sidekiq
不要忘记这样做。
# config/application.rb
module YourApp
class Application < Rails::Application
...
config.active_job.queue_adapter = :sidekiq
...
end
end
EDIT: 如果你对如何调度感兴趣,那要看你使用的是什么技术. Heroku调度器. 如果你是在数字海洋中部署,你可以使用Cron Jobs。