从Ruby on Rails应用程序启动和停止eventmachine服务器的最佳选择是什么

时间:2011-03-22 03:42:56

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

CORRECTION:

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

(我被告知'瘦'会对此有用。)

注意: 此EM服务器与运行Ruby on Rails应用程序的Mongrel服务器是SEPARATE。 (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

1 个答案:

答案 0 :(得分: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似乎不会断开已连接的任何内容,但会阻止任何进一步的连接建立到指定的端口。

希望有一些用处!