2011-02-04 12 views
13

में प्रत्येक कॉल के दौरान पेलोड कक्षाओं को फिर से लोड करने के लिए कैसे मैं देरी नौकरी कार्यकर्ता चला रहा हूं। जब भी मैंने foo विधि का आह्वान किया, तो कार्यकर्ता hello प्रिंट करता है।विलंबित कार्य: विकास मोड

class User 
    def foo 
    puts "Hello" 
    end 
    handle_asynchronously :foo 
end 

अगर मैं foo विधि में कुछ परिवर्तन करने, मैं परिवर्तनों को प्रतिबिंबित करने के लिए कार्यकर्ता को पुनः आरंभ करने की है। विकास मोड में यह काफी थकाऊ हो सकता है।

मैं प्रत्येक अनुरोध के लिए पेलोड क्लास (इस मामले में उपयोगकर्ता कक्षा) को फिर से लोड करने का एक तरीका खोजने का प्रयास कर रहा हूं। मैंने पेलोड विधि आमंत्रण से पहले require_dependency को आमंत्रित करने के लिए विलंबित जॉब लाइब्रेरी को पैच करने की कोशिश की बंदर की कोशिश की।

module Delayed::Backend::Base 
    def payload_object_with_reload 
    if Rails.env.development? and @payload_object_with_reload.nil? 
     require_dependency(File.join(Rails.root, "app", "models", "user.rb")) 
    end 
    @payload_object_with_reload ||= payload_object_without_reload 
    end 
    alias_method_chain :payload_object, :reload 
end 

यह दृष्टिकोण require_dependency जरूरतों का उपयोग कर पंजीकृत वर्ग के रूप में काम नहीं करता है मंगलाचरण से पहले पुनः लोड करना होगा और मैं पता लगा नहीं किया है यह कैसे करना है। मैंने प्रत्येक अनुरोध के लिए कक्षाओं को फिर से लोड करने के तरीके को जानने के लिए प्रेषक कोड पढ़ने में कुछ समय बिताया। मैं रीलोड कोड का पता लगाने में सक्षम नहीं था।

क्या किसी ने इससे पहले कोशिश की है? आप मुझे आगे बढ़ने की सलाह कैसे देंगे? या क्या आपके पास रेल क्लास रीलोड कोड का पता लगाने के लिए कोई पॉइंटर्स है?

उत्तर

19

मुझे एक समाधान खोजने में कामयाब रहा। मैंने भारित कक्षाओं को साफ़ करने के लिए ActiveSupport::Dependencies.clear विधि का उपयोग किया।

एक फ़ाइल config/initializers/delayed_job.rb

Delayed::Worker.backend = :active_record 
if Rails.env.development? 
    module Delayed::Backend::Base 
    def payload_object_with_reload 
     if @payload_object_with_reload.nil? 
     ActiveSupport::Dependencies.clear 
     end 
     @payload_object_with_reload ||= payload_object_without_reload 
    end 
    alias_method_chain :payload_object, :reload 
    end 
end 
+1

धन्यवाद! यह बैकएंड के रूप में mongoid के साथ भी महान काम करता है। मुझे केवल काम करने के लिए पहली पंक्ति को हटाना पड़ा :) –

+0

अच्छा! कुछ ऐसा ही किया गया है लेकिन एक [अलग लिपि] के रूप में (http://stackoverflow.com/questions/1609586/rails-delayed-job-want-to-load-newest-version-of-job-class/7861250#7861250) और इसे [फोरमैन] के साथ एक साथ उपयोग करें (http://blog.daviddollar.org/2011/05/06/introducing-foreman.html) –

+0

मुझे वास्तव में समझ में नहीं आता * क्यों * लेकिन इससे मेरी रेल मेमोरी उड़ाती है सभी वातावरण (उत्पादन सहित) और गैर-डीजे उदाहरणों में। –

1

संस्करण 4.0.6 के रूप में, DelayedJob स्वचालित रूप से पुन: लोड करता है, तो Rails.application.config.cache_classes है false पर सेट करें:

विकास मोड में, यदि आप रेल 3.1+ का उपयोग कर रहे हैं, तो आपका एप्लिकेशन कोड स्वचालित रूप से प्रत्येक 100 नौकरियों को फिर से लोड करेगा या जब कतार समाप्त हो जाएगी। हर बार जब आप विकास में अपना कोड अपडेट करते हैं तो आपको विलंबित नौकरी को पुनरारंभ करने की आवश्यकता नहीं होती है।

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