2012-04-30 7 views
7

私は薄いサーバー上で実行しているレールアプリを持っています。これはEventMachineの実行ループを利用しています。問題は、wsから入ってきた情報を処理するem-websocketを含めることができ、EM実行ループを停止せずにwebsocketを停止して開始できるようにすることです。これが私がwebsocketを開始する方法です。薄いレールで安全にem-websocketを停止する

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

問題は開始/停止コードにあります。 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 

から問題は内部全角のWebSocketコードということであるEMからの署名を追跡することはありません:START_SERVERはそれをシャットダウンするEventMachine :: STOP_SERVER(署名)を呼び出すことができるように。 em-websocketを変更せずにこれらの機能を無効にする方法がありますので、これらのWebソケットを安全に起動/停止できますか?私はそれがstandart Eventmachineサーバーのようにもっと機能したら欲しいです。

答えて

3

EM :: 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 

だから今は、起動して、署名をキャプチャし、後でそれを使用して、それを止めることができます。その時点で署名が不明なので、startメソッドにはトラップコードはありません。あなたはメソッドの外側にsigをキャプチャしているので、あなたも外側にトラップし、そこに格納されたsigを使用することができます。

+0

これは私がやったことです。 – MobileOverlord

関連する問題