我有一个rails应用程序我在瘦服务器上运行以利用EventMachine运行循环.问题是我希望能够包含em-websocket来处理来自ws的信息并停止并启动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
问题是内部的em-websocket代码不跟踪来自EM:start_server的签名,以便能够调用EventMachine :: stop_server(签名)来关闭它.有没有办法可以在不修改em-websocket的情况下覆盖这些函数,这样我就可以安全地启动/停止这些websockets?我想它的表现更像是标准的Eventmachine服务器.
解决方法
在我看来,你不需要使用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) 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.