在薄薄的导轨上安全地停止em-websocket

时间:2012-04-30 13:05:50

标签: ruby-on-rails eventmachine thin em-websocket

我有一个rails应用程序我在瘦服务器上运行以利用EventMachine运行循环。问题是我希望能够包含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(签名)来关闭它。有没有办法可以在不修改em-websocket的情况下覆盖这些函数,这样我就可以安全地启动/停止这些websockets?我想它的表现更像是标准的Eventmachine服务器。

1 个答案:

答案 0 :(得分: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。