7

EventMachine実行ループを利用するためにシンサーバーで実行しているRailsアプリがあります。問題は、em-websocketを含めて、wsから着信する情報を処理し、EM実行ループを停止せずにWebsocketを停止および開始できるようにすることです。これが私が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

問題は、内部em-websocketコードがEM:start_serverからの署名を追跡せず、EventMachine :: stop_server(signature)を呼び出してシャットダウンできることです。em-websocketを変更せずにこれらの関数をオーバーライドして、これらのWebSocketを安全に開始/停止できるようにする方法はありますか?標準のEventmachineサーバーのように機能するかどうかを確認します。

4

1 に答える 1

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を使用できます。

于 2012-05-18T15:21:19.197 に答える