2012-04-30 15 views
7

Mam aplikację szyny używam na cienkim serwerze, aby wykorzystać pętlę uruchamiania EventMachine. Problem polega na tym, że chciałbym móc dołączyć em-websocket do przetwarzania informacji pochodzących z ws i zatrzymać i uruchomić websocket bez zatrzymywania pętli EM. Tak właśnie uruchamiam websocket.Bezpieczne zatrzymywanie em-websocket w szynach cienkich

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

Problem dotyczy kodu start/stop. Od docs EM-websocket za

#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 

Problem polega na tym, że wewnętrzny kod em-websocket nie zapisuje podpis pochodzących z EM: START_SERVER aby móc wywołać EventMachine :: STOP_SERVER (podpis), aby go zamknąć. Czy istnieje sposób, w jaki mogę zastąpić te funkcje bez modyfikowania em-websocket, aby móc bezpiecznie uruchamiać/zatrzymywać te strony internetowe? Chciałbym, żeby działał bardziej jak standardowy serwer Eventmachine.

Odpowiedz

3

Wydaje mi się, że nie musisz używać EM :: Websocket.start(). Zamiast tego napisz swój własny kod start/stop, a następnie samodzielnie zarządzaj sygnaturą.

# 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 

Teraz możesz rozpocząć i przechwycić podpis i zatrzymać go później, używając go. Brak kodu pułapki w metodzie początkowej, ponieważ w tym momencie podpis nie jest znany. Ponieważ przechwytujesz sig poza metodą, możesz również wychwycić na zewnątrz i użyć zapisanego siga.

+0

Tak właśnie zrobiłem. – MobileOverlord