首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在rails on thin中安全停止em-websocket

在rails on thin中安全停止em-websocket
EN

Stack Overflow用户
提问于 2012-04-30 21:05:50
回答 1查看 1K关注 0票数 7

我有一个运行在瘦服务器上的rails应用程序来利用EventMachine run循环。问题是,我希望能够包含em-websocket来处理来自ws的信息,并在不停止EM运行循环的情况下停止和启动websocket。这就是我启动websocket的方式。

代码语言:javascript
复制
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
  ws.onopen { }
  ws.onclose { }
  ws.onmessage { |msg| }
end

问题出在启动/停止代码中。来自em-websocket的文档

代码语言:javascript
复制
#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的情况下覆盖这些函数,这样我就可以安全地启动/停止这些websocket?我希望它的性能更像standart Eventmachine服务器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-18 23:21:19

在我看来,您不需要使用EM::Websocket.start()。相反,编写您自己的启动/停止代码,然后您可以自己管理签名。

代码语言:javascript
复制
# 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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10384209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档