2012-11-12 18 views
12

मेरे पास रेल ऐप पर रूबी है जिसमें मैं हर कुछ सेकंड में कुछ कोड चलाने के लिए एक रास्ता खोजने का प्रयास कर रहा हूं।रेल आवधिक कार्य

मुझे क्रॉन, या क्रॉन-जैसे कार्यान्वयन का उपयोग करके बहुत सारी जानकारी और विचार मिल गए हैं, लेकिन ये केवल मिनट के लिए सटीक हैं, और/या बाहरी उपकरणों की आवश्यकता है। मैं हर 15 सेकंड या उससे अधिक कार्य को किक करना चाहता हूं, और मैं चाहता हूं कि यह एप्लिकेशन के भीतर पूरी तरह से निहित हो (यदि ऐप बंद हो जाता है, कार्य बंद हो जाता है, और कोई बाहरी सेटअप नहीं होता है)।

इसका उपयोग कैश डेटा की पृष्ठभूमि पीढ़ी के लिए किया जा रहा है। प्रत्येक कुछ सेकंड, कार्य कुछ डेटा इकट्ठा करेगा, और उसके बाद इसे एक कैश में संग्रहीत करेगा जो सभी क्लाइंट अनुरोधों द्वारा उपयोग किया जाता है। कार्य बहुत धीमा है, इसलिए इसे पृष्ठभूमि में चलाने की आवश्यकता है और ग्राहक अनुरोधों को अवरुद्ध नहीं करना है।

मैं रूबी के लिए बिल्कुल नया हूं, लेकिन एक मजबूत पर्ल पृष्ठभूमि है, और जिस तरह से मैं इसे हल करूँगा वहां एक अंतराल टाइमर & हैंडलर बनाना होगा जो फोर्क, कोड चलाता है, और फिर पूरा होने पर बाहर निकलता है।
क्लाइंट अनुरोध को अनुकरण करने के लिए यह भी अच्छा हो सकता है और रेल नियंत्रक का कांटा स्वयं ही हो सकता है। इस तरह से मैं इसके लिए यूआरआई मारकर कार्य को बंद कर सकता हूं (हालांकि यह कार्य हर कुछ सेकंड में चल रहा है, मुझे संदेह है कि मुझे कभी भी इसकी आवश्यकता होगी, लेकिन भविष्य में इसका उपयोग हो सकता है)। हालांकि आवधिक कार्य शेड्यूलर (एक बार मेरे पास एक बार) द्वारा जो भी तरीका कहा जा रहा है, उसे नियंत्रक कॉल करने के लिए यह छोटा होगा।

उत्तर

2

आम तौर पर, इस तरह के कोई भी तरीका नहीं है कि मैं एप्लिकेशन के भीतर आवधिक कार्य बनाने के बारे में जानता हूं। रेल रैक पर बनाया गया है और यह http अनुरोध प्राप्त करने, कुछ करने, और फिर वापस आने की अपेक्षा करता है। तो आपको केवल अपने आप को आवधिक कार्य का प्रबंधन करना होगा।

मुझे लगता है कि आपको आवृत्ति को चलाने के लिए आवश्यक आवृत्ति दी गई है, एक सभ्य समाधान सिर्फ एक साधारण रेक कार्य लिखना है जो हमेशा के लिए लूप करता है, और उसी समय इसे बंद करने के लिए जब आप अपना आवेदन शुरू करते हैं फोरमैन की तरह कुछ। फ़ोरमैन को अक्सर अपने ऐप्स के साथ पृष्ठभूमि श्रमिकों को शुरू/बंद करने के प्रबंधन के लिए इस तरह उपयोग किया जाता है। उत्पादन पर, आप मॉनिट जैसी प्रक्रियाओं को प्रबंधित करने के लिए कुछ और उपयोग करना चाह सकते हैं।

+0

मैंने केवल एक साधारण टूल बनाया जो कि रेल ऐप शुरू होने पर समय-समय पर कार्य करता है और समय-समय पर कार्य की सूची चलाता है। इसके माध्यम से प्रत्येक पाश यह देखने के लिए जांच करता है कि क्या माता-पिता अभी भी जीवित है या नहीं, अगर छोड़ देता है। – Patrick

0

देरी की तरह कुछ उपयोग करें, और इसे हर बार आवश्यक है?

every 15.minutes do 
    MyClass.do_stuff 
end 

कोई समय निर्धारण क्रॉन नौकरियों है या बाहरी सेवाओं के साथ monkeying:

+0

उन्होंने कहा कि वह इसे एप्लिकेशन के हिस्से के रूप में चाहते थे और केवल उनका आवेदन चलने पर जीवित रहें। ओवरकिल की तरह लगता है? – Altonymous

+0

किकर यह है कि इसे एक नई प्रक्रिया में चलाने की आवश्यकता होगी, इसलिए वेब प्रक्रिया वेब अनुरोधों की सेवा जारी रख सकती है। तो आप अपना खुद का फोर्किंग सर्वर बना सकते हैं ... या मौजूदा पुस्तकालयों का पुन: उपयोग करें। – DGM

10

मैं जब भी मणि https://github.com/javan/whenever

यह आप की तरह एक कार्यक्रम निर्दिष्ट कर सकते हैं सुझाव देना चाहेंगे।

+1

आपको जब भी किसी कार्य के लिए रेल इंस्टेंस शुरू करना है, तब से आपको सावधान रहना होगा। जब कार्य शुरू होने के लिए निर्धारित होता है और जब रेल प्रारंभ होता है तो इसमें देरी होती है। – mguymon

+2

मुझे लगता है कि जब भी सबसे छोटी समय इकाई मिनट होती है, तो आप इसके साथ '15. सेकेंड 'का उपयोग नहीं कर सकते हैं। – t00ny

2

आप या तो लिख सकते हैं आप ही विधि, rails runner MyWorker.work साथ

class MyWorker 
    def self.work 
    #do you work 
    sleep 15 
    end 
end 

यह रन की तरह कुछ एक अलग प्रक्रिया पृष्ठभूमि में चल रहा होगा

या आप की तरह कुछ का उपयोग कर सकते Resque, लेकिन यह एक अलग दृष्टिकोण है। यह इस तरह काम करता है: कुछ कतार में एक कार्य जोड़ता है, इस बीच एक कर्मचारी कतार में जो भी काम करता है उसे लाता है, और इसे खत्म करने की कोशिश करता है।

तो यह आपकी अपनी जरूरत पर निर्भर करता है।

0

घटना यामाइन का उपयोग करने वाले पतले या अन्य सर्वर का उपयोग करें, फिर केवल ईवेंट का उपयोग करें जो ईवेंटमाचिन का हिस्सा हैं। उदाहरण: config/application.rb

EM.add_periodic_timer(2) do 
    do_this_every_2_sec 
end