Mob*_*ord 7 ruby-on-rails thin eventmachine 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
Run Code Online (Sandbox Code Playgroud)
问题出在启动/停止代码中.来自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
Run Code Online (Sandbox Code Playgroud)
问题是内部的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[: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
Run Code Online (Sandbox Code Playgroud)
因此,现在您可以启动并捕获签名,并在以后使用它时停止它。启动方法中没有陷阱代码,因为此时签名未知。由于您在方法外部捕获 sig,因此您也可以在外部捕获并使用那里存储的 sig。