2012-08-13 15 views
9

मैं एक समारोह है कि delayed_job द्वारा अतुल्यकालिक रूप से नियंत्रित किया जा करने के लिए चिह्नित किया गया है है:एक delayed_job करने के लिए एक ब्लॉक पासिंग

class CapJobs 
    def execute(params, id) 
    begin 
     unless Rails.env == "test" 
     Capistrano::CLI.parse(params).execute! 
     end 
    rescue 
     site = Site.find(id) 
     site.records.create!(:date => DateTime.now, :action => "Task Failure: #{params[0]}", :type => :failure)  
     site.save 
    ensure 
     yield id 
    end 
    end 
    handle_asynchronously :execute 
end 

जब मैं इस समारोह मैं एक ब्लॉक में पारित चलाएँ:

capjobs = CapJobs.new 
capjobs.execute(parameters, @site.id) do |id| 
    asite = Site.find(id) 
    asite.records.create!(:date => DateTime.now, :action => "Created", :type => :init) 
    asite.status = "On Demo" 
    asite.dev = true 
    asite.save 
end 

यह काम करता है ठीक है जब बिना देरी के चलते चला जाता है * लेकिन जब मैं इसके साथ दौड़ता हूं तो मुझे निम्न त्रुटि मिलती है

2012-08-13T09:24:36-0300: [Worker(delayed_job host:eagle pid:12089)] SitesHelper::CapJobs#execute_without_delay failed with LocalJumpError: no block given (yield) - 0 failed attempts 
2012-08-13T09:24:36-0300: [Worker(delayed_job host:eagle pid:12089)] PERMANENTLY removing SitesHelper::CapJobs#execute_without_delay because of 1 consecutive failures. 
2012-08-13T09:24:36-0300: [Worker(delayed_job host:eagle pid:12089)] 1 jobs processed at 0.0572 j/s, 1 failed ... 

ऐसा लगता है कि यह नहीं उठाया जाता है जिस ब्लॉक को पारित किया गया था। क्या यह करने का सही तरीका नहीं है या मुझे एक अलग विधि मिलनी चाहिए?

उत्तर

1

मुझे ऐसा करने का एक तरीका मिला। यह हैकी की तरह है लेकिन अच्छी तरह से काम करता है। मुझे this article मिला जो एक SerializableProc वर्ग बनाने के बारे में बात करता है। अगर मैं इसे समारोह में पास करता हूं तो सबकुछ बढ़िया काम करता है।

+2

आप कृपया पोस्ट कर सकता कौन-सा कोड का इस्तेमाल किया? – brauliobo

8

देरी_job आपकी नौकरियों को डेटा स्टोर (अक्सर आपके प्राथमिक डेटाबेस) में सहेजकर काम करता है और फिर पृष्ठभूमि प्रक्रिया में इस डेटा स्टोर से नौकरियां लोड कर रहा है, जहां इसे संभाला/निष्पादित किया जाता है।

डेटाबेस में नौकरी बचाने के लिए, delayed_job को किसी भी तरह से किस तर्क के साथ कॉल करने के लिए किस विधि को कॉल करने की आवश्यकता है, उसे सहेजने की आवश्यकता है। यह सब कुछ एक स्ट्रिंग में क्रमबद्ध करके किया जाता है (देरी_job उस के लिए yaml का उपयोग करता है)। दुर्भाग्यवश, ब्लॉक को क्रमबद्ध नहीं किया जा सकता है। तो पृष्ठभूमि कार्यकर्ता ब्लॉक तर्क के बारे में नहीं जानता है और इसके बिना विधि को कॉल करता है। यह परिणाम LocalJumpError में होता है जब विधि ब्लॉक में उपज करने की कोशिश कर रही है।

0

अधिकांश लोग इसे एक अमूर्त समस्या के रूप में मानेंगे।

प्रो कोड शायद रन-टू-रन (वर्र्स को छोड़कर) से नहीं बदला जा रहा है और इसलिए आपको ब्लॉक कोड को क्लास या इंस्टेंस विधि में बनाना चाहिए। कि विधि का नाम दर्रा, और फिर अपने execute विधि में यह कहते हैं, की तरह

@some_data = CapJobs.send(target_method)

या शायद-बेहतर भी

@some_data = DomainSpecificModel.send(target_method)

संबंधित मुद्दे