2012-04-30 26 views
7

पर रेल में एम-वेबस्केट को सुरक्षित रूप से रोकना मेरे पास एक रेल ऐप है जो मैं EventMachine रन लूप का उपयोग करने के लिए पतली सर्वर पर चल रहा हूं। समस्या यह है कि मैं डब्ल्यूएस से आने वाली जानकारी को संसाधित करने के लिए एम-वेबस्केट को शामिल करने और ईएम रन लूप को रोकने के बिना वेबसाकेट शुरू करने में सक्षम होना चाहता हूं। इस प्रकार मैं वेबस्केट शुरू कर रहा हूं।पतली

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws| 
    ws.onopen { } 
    ws.onclose { } 
    ws.onmessage { |msg| } 
end 

समस्या प्रारंभ/रोक कोड में है। start_server कॉल करने के लिए EventMachine :: stop_server (हस्ताक्षर) इसे बंद करने के लिए सक्षम होने के लिए: उन्हें-WebSocket के डॉक्स

#Start WebSocket 
def self.start(options, &blk) 
    EM.epoll 
    EM.run do 

    trap("TERM") { stop } 
    trap("INT") { stop } 

    EventMachine::start_server(options[:host], options[:port], 
     EventMachine::WebSocket::Connection, options) do |c| 
     blk.call(c) 
    end 
    end 
end 


#Stop WebSocket 
def self.stop 
    puts "Terminating WebSocket Server" 
    EventMachine.stop 
end 

से समस्या यह है कि आंतरिक उन्हें-WebSocket कोड ईएम से आ रही हस्ताक्षर ट्रैक नहीं करता है। क्या कोई तरीका है कि मैं इन फ़ंक्शंस को एम-वेबस्केट को संशोधित किए बिना ओवरराइड कर सकता हूं ताकि मैं इन websockets को सुरक्षित रूप से प्रारंभ/बंद कर सकूं? मैं चाहूंगा कि यह स्टैंडस्टार्ट Eventmachine सर्वर की तरह अधिक प्रदर्शन करता है।

उत्तर

3

मुझे लगता है कि आपको ईएम :: Websocket.start() का उपयोग करने की आवश्यकता नहीं है। इसके बजाय अपना खुद का स्टार्ट/स्टॉप कोड लिखें, फिर आप हस्ताक्षर को स्वयं प्रबंधित कर सकते हैं।

# start a ws server and return the signature 
# caller is responsible for +trap+ing to stop it later using said signature. 
def start_ws_server(options, &blk) 
    return EventMachine::start_server(options[:host], options[:port], 
    EventMachine::WebSocket::Connection, options) do |c| 
    blk.call(c) 
    end 
end 

# stop a previously started ws server 
def stop_ws_server(signature) 
    EventMachine::stop_server signature 
end 

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

+0

यही वह है जो मैंने किया। – MobileOverlord