【问题标题】:What's the best option for starting and stopping an eventmachine server from a Ruby on Rails application从 Ruby on Rails 应用程序启动和停止 eventmachine 服务器的最佳选择是什么
【发布时间】:2011-03-22 03:42:55
【问题描述】:

更正:

具体来说,我希望通过 Ruby on Rails 控制器启动和停止 EventMachine (EM)。

(有人告诉我,'Thin' 可以很好地解决这个问题。)

注意: 这个 EM 服务器与运行 Ruby on Rails 应用程序的 Mongrel 服务器是分开的。 (EM 服务器正在接受来自 Arduino 微控制器的连接。)

作为服务器运行'Thin' .. 我应该能够接受 HTTP 请求和 Arduino 的连接。

# Starts Server
def start_control_server
    EventMachine::run {
        @EchoServer = EventMachine::start_server "0.0.0.0", 40013, EchoServer
    }
end

# Attempts ( fails ) to stop server
def stop_control_server
    EventMachine.stop_server(@EchoServer)
end

如果您推荐其他服务器而不是直接的 EventMachine,请提供执行上述代码的代码。

此处提供完整的控制器代码:http://pastie.org/1698383

【问题讨论】:

  • EventMachine.stop_event_loop 来自 EM 文档:“它会导致处理循环停止执行,这将导致所有打开的连接和接受服务器停止运行并关闭。” ** 尚未验证 **

标签: ruby-on-rails ruby arduino thin eventmachine


【解决方案1】:

我猜你没有在另一个控制器方法中调用 start_control_server 和 stop_control_server。这意味着当您调用 stop 时,您的实例变量 (@EchoServer) 将不存在。

一种解决方案可能是将 start_server 返回的 id 存储在会话中。如

  def start_control_server
    session[:em_server_id] = EventMachine::start_server "0.0.0.0", 4000, EchoServer
  end

  def stop_control_server
    EventMachine.stop_server(session[:em_server_id]) if session[:em_server_id]
    session[:em_server_id] = nil
  end

另外,如果您正在使用 Thin 运行您的 Rails 应用程序,那么您已经处于事件机器循环中,因此您不需要调用 EventMachine::run。调用 EventMachine.stop_server 似乎不会断开任何已连接的连接,但会阻止与指定端口建立任何进一步的连接。

希望对你有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2016-05-04
    • 2010-09-09
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多