如何在Rails中使用delayed_job取消预定作业?

mdr*_*iel 36 ruby ruby-on-rails delayed-job ruby-on-rails-3

我安排一份工作,比如10分钟.如何在不使用模型中任何类型的脏字段的情况下正确取消此特定作业等.是否有任何要求删除特定工作或与特定模型,实例等相关的工作的电话?

hou*_*se9 52

免责声明:我不是delayed_job的专家用户......

" 有没有要求删除特定工作,或与特定模型,实例等相关的工作? "

Delayed :: Job只是一个ActiveRecord对象,因此您可以查找并销毁任何这些记录.根据您的使用情况,可以采用不同的方式处理.如果有人要手动销毁它们,可以通过Web应用程序中的管理界面来处理.

# list all jobs
Delayed::Job.all
# find a job by id
job = Delayed::Job.find(params[:id])
# delete it
job.delete
Run Code Online (Sandbox Code Playgroud)

如果您需要按"作业类型"删除作业的某些流程外任务,您可以遍历每个作业,如果它与您的作业匹配则将其删除; 在脚本/控制台中尝试此操作

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

如果你想删除MyJob类型的所有作业,请给出上述内容

Delayed::Job.all.each do |job|
    if job.name == "MyJob" then
        job.delete
    end
end
Run Code Online (Sandbox Code Playgroud)

这对你的情况可能有所帮助吗?在许多情况下,您可能希望删除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"
Run Code Online (Sandbox Code Playgroud)

这样你可以更有选择性地删除哪些记录?

希望这能为您提供有关处理它的可能方法的足够信息吗?

  • 您应该使用"destroy"而不是"delete". (10认同)

fir*_*ien 7

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