gpt4 book ai didi

ruby-on-rails - 安全地在细长的 rails 中停止 em-websocket

转载 作者:行者123 更新时间:2023-12-04 12:42:35 25 4
gpt4 key购买 nike

我有一个在瘦服务器上运行的 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(signature) 来关闭它。有没有一种方法可以在不修改 em-websocket 的情况下覆盖这些功能,以便我可以安全地启动/停止这些 websocket?我希望它的性能更像是标准的 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

所以现在您可以开始并捕获签名,并在以后使用它停止它。 start 方法中没有陷阱代码,因为此时签名未知。由于您是在方法之外捕获 sig,因此您也可以在外部捕获并在那里使用存储的 sig。

关于ruby-on-rails - 安全地在细长的 rails 中停止 em-websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10384209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com