2010-09-03 26 views
35

Tôi đang lập kế hoạch một công việc để chạy trong nói, 10 phút. Cách hủy đúng công việc cụ thể này mà không cần sử dụng bất kỳ loại trường thừa nào trong mô hình và vân vân. Có bất kỳ cuộc gọi nào để xóa công việc cụ thể hoặc các công việc liên quan đến mô hình cụ thể, ví dụ, v.v. không?Làm cách nào để hủy công việc đã lên lịch với delay_job trong Rails?

Trả lời

49

từ chối trách nhiệm: Tôi không phải là một người sử dụng chuyên gia của delayed_job ...

"? Có bất kỳ cuộc gọi để loại bỏ công việc cụ thể, hoặc các công việc liên quan đến mô hình cụ thể, chẳng hạn, vv"

Chậm :: Công việc chỉ là đối tượng ActiveRecord để bạn có thể tìm và hủy bất kỳ bản ghi nào. Tùy thuộc vào trường hợp sử dụng của bạn, điều này có thể được xử lý theo nhiều cách khác nhau. Nếu ai đó sẽ tự hủy chúng, điều này có thể được xử lý thông qua giao diện quản trị trong ứng dụng web của bạn.

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

nếu bạn cần một số quy trình xóa công việc bằng 'loại công việc', bạn có thể lặp lại từng công việc và xóa nó nếu nó phù hợp với công việc của bạn; thử điều này trong kịch bản/console

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" 

để trao trên nếu bạn muốn xóa tất cả các công việc của loại MyJob

Delayed::Job.all.each do |job| 
    if job.name == "MyJob" then 
     job.delete 
    end 
end 

này có thể hoặc không có thể giúp cho tình hình của bạn? trong nhiều trường hợp, bạn có thể muốn xóa MyJob nhưng chỉ ở nơi thuộc tính: some_value là 'abc' chứ không phải 'xyz'. Trong trường hợp này, bạn có thể cần phải thực hiện một 'display_name' trên đối tượng MyJob của bạn. job.name sẽ sử dụng điều này nếu nó tồn tại

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" 

theo cách này bạn có thể chọn lọc hơn về những bản ghi cần xóa?

hy vọng điều này sẽ cung cấp cho bạn đủ thông tin về các cách có thể để xử lý?

+1

Giải pháp hoàn hảo! – mdrozdziel

+10

Có lẽ bạn nên sử dụng "hủy" thay vì "xóa". –

+1

Chết tiện dụng, cảm ơn câu trả lời thực sự chi tiết. + –

7

delay_job 3 giới thiệu thuộc tính queue. Điều này có thể bị tấn công để lên lịch cho công việc có thể hủy.

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 
) 
+0

Tôi thực sự không khuyên bạn nên làm những việc theo cách này. The'queue' có nghĩa là để cho phép ứng dụng mở rộng. Bạn đã trải qua một Struct tùy chỉnh, chỉ cần chọn một tên thuộc tính khác mà house9 đã làm. – Dex

Các vấn đề liên quan