2015-02-28 9 views
6

ब्लॉक करता है मेरे पास एक रेल ऐप है जिसमें मेरे पास एक ऐसा फ़ंक्शन है जो बहुत से ईमेल भेजता है। मैं इसे asynchronously करना चाहता हूं और मैंने सोचा कि विधि deliver_later ऐसा करेगी। वर्तमान में मुझे कुछ देरी है जब उपयोगकर्ता submit पर क्लिक करता है जब तक फॉर्म सबमिट नहीं किया जाता है - जो खराब उपयोगकर्ता अनुभव की ओर जाता है (यह एक साधारण सरल रूप है)। मेरा कार्यान्वयन इस तरह दिखता है:रेल 4 - मेलर delivery_later जो मैं उम्मीद करता हूं वह नहीं कर रहा, यूआई

def create 

    respond_to do |format| 
    if @competition.save 
     [...] 
     send_notification_to_team_members 
    end 
end 

def send_notification_to_team_members 
    @team.members.each do |member| 
    unless member.user.eql?(current_user) 
     Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later 
    end 
    end 
end 

वर्तमान में कार्रवाई समाप्त होने में ~ 4 सेकंड लगते हैं। मैंने यह भी कोशिश की है:

Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later(wait: 1.minute) 

फिर इसमें अधिक समय लगता है - मैं अनुमान लगाता हूं ~ 1 मिनट।

तो, क्या मैं deliver_later गलत तरीके से उपयोग कर रहा हूं, या यह तरीका है जो मैं अपेक्षा करता हूं। उस स्थिति में, क्या कोई और तरीका है जिसका उपयोग मैं अपने प्रदर्शन को बेहतर बनाने के लिए कर सकता हूं?

+0

आप किस सक्रिय बैकएंड का उपयोग कर रहे हैं? –

+0

आपको ई-मेल को असीमित रूप से भेजना चाहिए। यदि आप 4.2 का उपयोग कर रहे हैं तो आप ActiveJob का उपयोग कर सकते हैं, या यदि आपको साइडकीक या बचाव के रूप में ऐसे समाधानों का उपयोग नहीं करना चाहिए। –

+0

FYI: [यहां] (https: //blog.engineyard.com/2014/getting-started-with-active-job) ई-मेल भेजने के लिए ActiveJob का उपयोग करने के बारे में अच्छा लेख है। –

उत्तर

14

deliver_laterActiveJob का उपयोग एसिंक्रोनस निष्पादन प्रदान करने के लिए करता है।

हालांकि ActiveJob एसिंक्रोनिटी स्वयं प्रदान नहीं करता है - यह एक एकीकृत एपीआई परत है जिसे कई बैकएंड द्वारा पूरा किया जा सकता है। डिफ़ॉल्ट एक बस इनलाइन सब कुछ चलाता है यह async नहीं है।

एसिंक उपयोग प्राप्त करने के लिए आपको एक एसिंक्रोनस बैकएंड लेने की आवश्यकता है। आप

config.active_job.queue_adapter = ... 

सामान्य सबसे एडेप्टर में एक इसी मणि की आवश्यकता होती है अपने आवेदन की config में बैकएंड कॉन्फ़िगर कर सकते हैं (उदाहरण के लिए delayed_job, sidekiq, sucker_punch) ने अपने निर्भरता भी हो सकता है (उदाहरण के लिए sidekiq आवश्यकता है कि आप redis का उपयोग करें।

+0

धन्यवाद! मैंने 'delayed_job' को इंस्टॉल करने का निर्णय लिया: 'gem' delayed_job_active_record'', और मैंने यहां इंस्टॉलेशन प्रक्रिया का पालन किया है: https://github.com/collectiveidea/delayed_job_active_record। 'Application.rb' में मैंने जोड़ा है: 'config.active_job.queue_adapter =: delayed_job'। और मैं इसे इस तरह उपयोग करता हूं: 'Mailer.deliver_new_competition_notification (member.user, @competition) .deliver_later!'। मुझे कोई त्रुटि नहीं मिलती है, लेकिन ईमेल वितरित नहीं होते हैं - 'लोकहोस्ट: 3000' पर। क्या मुझे कुछ याद आया है? – Anders

+0

@ एंडर्स आपको एक या अधिक देरी नौकरी श्रमिकों को शुरू करने की आवश्यकता है –

+0

धन्यवाद, मैंने इसके बजाए 'साइडकीक' के साथ जाने का फैसला किया। सोचा कि यह सेटअप करना आसान लग रहा था। लेकिन मैं कुछ अन्य मुद्दों में भाग गया, यहां एक नया प्रश्न पूछा: http://stackoverflow.com/questions/28796293/rails-4-2-sidekiq-not-sending-emails-in-development – Anders

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

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