2011-07-27 16 views
9

Özel bir iş sınıfında run_at datetime almaya çalışıyorum. Benim kod şöyle görünür:Delayed_Job: iş meta verilerine erişme ve/veya yinelenen işleri önleme

class MyCustomJob < Struct.new(:my_object) 

    def perform 
    if self.run_at == my_object.start_time 
     # process the job 
    end 
    end 

end 

ben de bir Delayed::Job.find(self) çalıştı ama hayır şans vardı. peşin

sayesinde

+2

yapmak ** ** ** ** ** yönteminin içinde ** Gecikmeli :: İş ** AR nesnesini almak ister misiniz? – Anatoly

+0

tam olarak! nesnenin start_time değerinin değişip değişmediğini kontrol etmem gerekiyor. – Oliver

cevap

8
işi oluştururken

Bununla başa olmalıdır:

priority = 0 
    run_time = my_object.start_time 
    Delayed::Job.enqueue(MyCustomJob.new(my_object), priority, run_time) 

https://github.com/tobi/delayed_job/wiki

işlerinizi beklenen anda çalışan değilseniz, sen UTC için zamanlama olabilir :

http://www.gregbenedict.com/2009/08/19/is-delayed-job-run_at-datetime-giving-you-fits/

varolan j için kuyruğunu kontrol etmek ob - Aşağıdaki yapabilirdi:


class MyCustomJob < Struct.new(:object_id) 

    def self.exists?(object_id) 
    Delayed::Job.where(['handler = ? and failed_at is null',handler(object_id)]).count(:all) > 0 
    end 

    def self.handler(object_id) 
    "--- !ruby/struct:MyCustomJob \nobject_id: #{object_id}\n" 
    end 

    def perform 
    my_object = MyObject.find(object_id) 
    my_object.do_stuff 
    end 
end 

Sonra sadece kuyruk önce MyCustomJob.exists?(my_object.id) kontrol edin.

Biraz kesmek - gerektiği gibi handler yöntemini düzenleyin. Delayed_jobs tablosunu, iş tablonuz büyükse veya diğer iş türleri ile yaparsanız daha temiz tablo ve daha verimli tablo taraması yapmak için bir class/object_id değerine sahip olacak şekilde değiştiririm.

Bu soru aynı zamanda ilgili görünüyor:

How to cancel scheduled job with delayed_job in Rails?

+0

hm Zaten işimi böyle sıraya koydum. İş çalışırken nesne üzerinde start_time değiştiğini kontrol etmem gerekiyor. – Oliver

+0

düzenlemeleri görün. . . – klochner

+0

Cevabınız için teşekkürler! Bu bir zamanlama problemi değil .. Bir takvimdeki bir olayım var diyelim .. Etkinlik başlamadan önce 10 dakika önce bir hatırlatma mesajı göndermek istiyorum .. bu yüzden kuyrukta bir iş var .. birisi olayı değiştirir ertesi gün .. şimdiki işin hala geçerli olup olmadığını kontrol etmem gerekiyor .. – Oliver

10

size özel iş yönteminden önce bir tanımlarsanız, işçi gerçekleştirmek çağırmadan önce size gecikmiş iş örneğini geçecek:

class MyCustomTask 

    def before(job) 
    @job = job 
    end 

    def perform 
    # has access to @job object. 
    # You may need to call @job.reload to see in-flight changes to object in the database. 
    end 
end 
İlgili konular