2011-11-11 16 views
5

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

  1. प्रयोक्ता प्रकार संदेश (ब्राउज़र चैट क्लाइंट)
  2. संदेश XMPP के माध्यम से सर्वर से आता है
  3. संदेश एपीआई
  4. प्रतिक्रिया प्राप्त होता है
  5. रिस्पांस चैट क्लाइंट के लिए वापस भेज दिया जाता है के लिए भेज दिया जाता है ।

इस के लिए मेरे कोड के रूप में

admin_muc_client.activate_message_callbacks do |m|    
    sender = m.from.resource 
    room_slug = m.from.node 
    message = m.body     

    r = HTTParty.get('http://example.com/api/v1/query?msg=message') 
    Rails.logger.debug(r.inspect) 
    admin_muc_client.send_message("Message #{r.body}") if m.from.resource != 'admin' 
end 
इस प्रकार है

मेरे यहाँ चिंता यह है कि जब से कॉलबैक evented है और एपीआई के लिए अनुरोध एक अवरुद्ध कॉल होगा इस पूरे आवेदन के लिए एक अड़चन बन सकता है । मैं जावास्क्रिप्ट के लिए AJAX जैसे कुछ का उपयोग करना पसंद करूंगा जो अनुरोध को आग लगाएगा और जब प्रतिक्रिया उपलब्ध हो तो डेटा भेजें। रूबी में मैं इसे कैसे कार्यान्वित कर सकता हूं?

मैंने देरी_job और पृष्ठभूमिआरबी को देखा है जो आग के लिए उपकरण की तरह दिखता है और संचालन भूल जाता है। मुझे कुछ ऐसी चीज चाहिए जो प्रतिक्रिया के साथ एक असीमित तरीके से कॉलबैक को सक्रिय करे।

मैं वास्तव में असीमित व्यवहार को प्राप्त करने के तरीके पर कुछ मदद की सराहना करता हूं। मैं रब्बीएमक्यू जैसे संदेश कतारों से भी परिचित हूं, जो मुझे लगता है कि महत्वपूर्ण जटिलता के अतिरिक्त होगा।

उत्तर

5

क्या आपने girl_friday पर देखा था? इसकी विकी से -

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

अन्य एसिंक समाधानों (Resque, dj, आदि) के किसी भी ज़िलियन का उपयोग क्यों नहीं करते? चूंकि girl_friday उन समाधानों की तुलना में आसान और अधिक कुशल है: girl_friday आपकी रेल प्रक्रिया में चलता है और सुरक्षित सहमति के लिए अभिनेता पैटर्न का उपयोग करता है। चूंकि यह एक ही प्रक्रिया में चलता है, आपको प्रक्रियाओं के एक अलग सेट की निगरानी करने, अलग कोडबेस को तैनात करने, उन प्रक्रियाओं के लिए रैम में सैकड़ों अतिरिक्त एमबी बर्बाद करने की आवश्यकता नहीं है। अधिक जानकारी के लिए रुबी में अभिनेताओं के लिए मेरा परिचय देखें।

आपको थ्रेड-सुरक्षित कोड लिखने की आवश्यकता है। ऐसा करना मुश्किल नहीं है: अभिनेता पैटर्न का मतलब है कि आपको एक संदेश मिलता है और उस संदेश को संसाधित करता है। कोई साझा डेटा नहीं है जिसके लिए ताले की आवश्यकता होती है और आपके एप्लिकेशन कोड में डेडलॉक हो सकती है। चूंकि girl_friday कवर के तहत थ्रेड का उपयोग करता है, इसलिए आपको यह सुनिश्चित करना होगा कि आपका रूबी वातावरण थ्रेड को कुशलता से निष्पादित कर सके। JRuby, Rubinius 1.2 और रूबी 1.9.2 अधिकांश अनुप्रयोगों के लिए पर्याप्त होना चाहिए। मैं इसके खराब थ्रेडिंग समर्थन के कारण रूबी 1.8 का समर्थन नहीं करता हूं।

मुझे लगता है कि यह वही है जो आप खोज रहे हैं।

+0

बहुत बढ़िया यह एक शॉट देगा। शायद यह यह है। – Sid

+0

मुझे यह पता चलता है कि यह कंसोल में काम करता है लेकिन विकास मोड में एप्लिकेशन में चलाए जाने पर कार्य को कतार में नहीं जोड़ता है। बीटीडब्ल्यू मैं देव मोड में यात्री और अपाचे चला रहा हूँ। – Sid

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