2012-04-30 17 views
7

Ho un'app per i binari Sono in esecuzione su thin server per utilizzare il ciclo di esecuzione di EventMachine. Il problema è che mi piacerebbe essere in grado di includere em-websocket per elaborare le informazioni provenienti da un ws e fermarsi e avviare il websocket senza interrompere il ciclo di esecuzione EM. Questo è come sto avviando il websocket.Arresto sicuro di em-websocket nelle guide sottili

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

Il problema è nel codice di avvio/arresto. Dalla documentazione di em-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 

Il problema è che il codice em-websocket interno non tiene la firma proveniente da EM: START_SERVER per essere in grado di chiamare EventMachine :: STOP_SERVER (firma) per spegnerlo. Esiste un modo per sovrascrivere queste funzioni senza modificare em-websocket in modo da poter avviare/arrestare in modo sicuro queste web socket? Mi piacerebbe se si comportasse più come il server Eventmachine standard.

risposta

3

A me sembra che non sia necessario utilizzare EM :: Websocket.start(). Invece scrivi il tuo codice di avvio/stop, quindi puoi gestire tu stesso la firma.

# 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 

Così ora è possibile avviare e acquisire la firma e interromperla in seguito utilizzandola. Nessun codice trap nel metodo start poiché a quel punto la firma è sconosciuta. Dato che stai catturando il sig al di fuori del metodo puoi intercettarlo anche all'esterno e usare il sig memorizzato lì.

+0

Questo è quello che ho finito per fare. – MobileOverlord

Problemi correlati