2011-07-27 13 views
9

मैं कस्टम नौकरी कक्षा में run_at डेटाटाइम प्राप्त करने का प्रयास कर रहा हूं। मेरे कोड इस तरह दिखता है:Delayed_Job: नौकरी मेटाडेटा और/या डुप्लिकेट नौकरियों से परहेज करना

class MyCustomJob < Struct.new(:my_object) 

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

end 

मैं भी एक Delayed::Job.find(self) की कोशिश की, लेकिन कोई किस्मत थी। पहले से

धन्यवाद

+2

करना आप ** विलम्बित :: नौकरी ** एआर ऑब्जेक्ट ** ** ** प्रदर्शन के अंदर प्राप्त करना चाहते हैं? – Anatoly

+0

बिल्कुल! मुझे यह जांचने की ज़रूरत है कि वस्तु का start_time बदल गया है या नहीं। – Oliver

उत्तर

8

जब आप काम बनाने के इस संभाल चाहिए:

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

अपनी नौकरी की उम्मीद समय में नहीं चल रहे हैं, तो आप उन्हें यूटीसी के लिए समय निर्धारण किया जा सकता है :

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

एक मौजूदा जे के लिए कतार जाँच करने के लिए ओब - आप निम्न कर सकता है:


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 

तो बस कतार से पहले MyCustomJob.exists?(my_object.id) लिए जाँच करें।

यह एक हैक का थोड़ा सा है - आवश्यकतानुसार handler विधि संपादित करें। मैं विलंब_jobs तालिका को क्लीनर कोड बनाने के लिए कक्षा/object_id रखने के लिए संशोधित करता हूं और यदि आपकी नौकरियां तालिका बड़ी है या आप अन्य प्रकार की नौकरियों के साथ ऐसा करते हैं तो अधिक कुशल टेबल स्कैन करें।

यह सवाल भी प्रासंगिक लग रहा है:

How to cancel scheduled job with delayed_job in Rails?

+0

एचएम मैं पहले से ही इस तरह की नौकरी कतार में हूँ। मुझे यह जांचने की ज़रूरत है कि जब नौकरी चलती है तो वस्तु पर start_time बदल जाता है या नहीं। – Oliver

+0

संपादन देखें। । । – klochner

+0

आपके उत्तर के लिए धन्यवाद! यह कोई समय की समस्या नहीं है .. मान लें कि मेरे पास कैलेंडर में एक ईवेंट है .. मैं ईवेंट शुरू होने से पहले एक अनुस्मारक 10 मिनट भेजना चाहता हूं .. इसलिए इसके लिए कतार में नौकरी है .. कोई व्यक्ति ईवेंट को बदल देता है अगले दिन .. तो मुझे यह जांचने की ज़रूरत है कि वर्तमान नौकरी अभी भी मान्य है .. – Oliver

10

आप अपने कस्टम काम पर विधि से पहले एक को परिभाषित है, तो कर्मी आप प्रदर्शन कॉल करने से पहले देरी काम उदाहरण पारित करेंगे:

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 
संबंधित मुद्दे