如何在Rails中用delayed_job取消预定的作业?
我正在安排一个工作,比如10分钟。 如何正确取消这个特定的工作,而不使用模型等任何一种肮脏的额外领域。 是否有任何呼吁去除特定的工作,或与特定的模型,实例等相关的工作?
免责声明:我不是delayed_job的专家用户…
“ 有没有呼吁去除特定的工作,或与特定的模型,实例等相关的工作? ”
Delayed :: Job只是一个ActiveRecord对象,所以你可以find并销毁任何这些logging。 根据您的使用情况,这可以通过不同的方式处理。 如果有人要手动销毁它们,这可以通过您的networking应用程序中的pipe理界面来处理。
# list all jobs Delayed::Job.all # find a job by id job = Delayed::Job.find(params[:id]) # delete it job.delete
如果你需要通过“工作types”删除一些工作任务,你可以遍历每一个工作,如果它匹配你的工作,可以删除它; 尝试在脚本/控制台
class MyJob < Struct.new(:some_value); def perform # ... end end my_job = MyJob.new('xyz') job = Delayed::Job.enqueue(my_job, 0, 1.hour.from_now) job.name # => "MyJob" job.handler # => "--- !ruby/struct:MyJob \nsome_value: xyz\n"
所以如果你想删除所有MyJobtypes的作业,就给出了上面的说明
Delayed::Job.all.each do |job| if job.name == "MyJob" then job.delete end end
这可能或可能不会帮助你的情况? 在许多情况下,你可能想要删除一个MyJob,但只有:some_value属性是'abc'而不是'xyz'。 在这种情况下,您可能需要在MyJob对象上实现“display_name”。 如果存在,job.name将使用它
class MyJob < Struct.new(:user_id); def perform # ... end def display_name return "MyJob-User-#{user_id}" end end # store reference to a User my_job = MyJob.new(User.first.id) # users.id is 1 job = Delayed::Job.enqueue(my_job, 0, 1.hour.from_now) job.name # => "MyJob-User-1" job.handler # => "--- !ruby/struct:MyJob \nuser_id: 1\n"
这样你可以更有select地删除哪些logging?
希望这给你足够的信息,可能的方式来处理它?
delayed_job 3引入了一个queue
属性。 这可以被劫持,以安排一个可取消的工作。
class MyJob < Struct.new(:user_id) def self.queue_name "something-unique" end def perform # ... end end #scheduler my_job = MyJob.new(User.first.id) #'cancel' pending jobs first Delayed::Job.where(queue: my_job.class.queue_name).destroy_all #queue it up Delayed::Job.enqueue(my_job, queue: my_job.class.queue_name, run_at: 1.hour.from_now )