ruby-on-rails – 在Rails 4.2中检查作业是否已经入队
发布时间:2020-12-16 21:04:41 所属栏目:百科 来源:网络整理
导读:我使用Rails 4.2和delayed_job 4.0.6作为我的ActiveJob后端. 我有一份工作,我只想在队列中允许一次.有问题的工作需要一分钟才能运行.它通过模型上的回调排队.回调将比工作完成时更频繁地发生.这项工作将来不必排队多次. 这是我想要完成的一些伪代码. # app/j
我使用Rails 4.2和delayed_job 4.0.6作为我的ActiveJob后端.
我有一份工作,我只想在队列中允许一次.有问题的工作需要一分钟才能运行.它通过模型上的回调排队.回调将比工作完成时更频繁地发生.这项工作将来不必排队多次. 这是我想要完成的一些伪代码. # app/jobs/refresh_account_cache_job.rb class RefreshAccountCacheJob < ActiveJob::Base def before_enqueue skip if job_already_enqueued end def perform Account.write_to_cache end def job_already_enqueued # ? end end 如果作业的实例在再次调用时正在运行,则它应该仍然排队以备将来使用.我正在寻找一种方法让这项工作最终入组,最多可以运行1次. 我假设答案必须特定于delayed_job,但如果它可以推广到ActiveJob,那将更好. 解决方法
这可能不是完全合适的,但它应该让你指向正确的方向:
def self.up create_table :delayed_jobs,:force => true do |table| table.integer :priority,:default => 0,:null => false table.integer :attempts,:null => false table.text :handler,:null => false table.text :last_error table.datetime :run_at table.datetime :locked_at table.datetime :failed_at table.string :locked_by table.string :queue table.timestamps end 因此,您可以向该表添加状态列,然后运行此类查询以获取作业并在执行任何其他操作之前检查其状态. 延迟:: Job.where(队列:’< YOUR QUEUE>‘).where(id:params [:id]).status 你问,你会如何设定状态?好吧,在延迟的工作中使用成功挂钩.它看起来有点像这样: def success(job) update_status('success') end private def update_status(status) job = Job.find job_id job.status = status job.save! end 希望这可以帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |