Rails中的EventMachine - 在哪里放置运行循环?

时间:2011-12-17 03:21:00

标签: ruby-on-rails ruby eventmachine em-websocket

我正在尝试运行一个在运行我的rails服务器时运行的EventMachine服务器,而不是作为一个单独的进程。

例如,使用here(em-websocket)中的简单服务器示例,您将获得以下(独立?)ruby代码:

EventMachine.run {

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
    ws.onopen {
      puts "WebSocket connection open"

      # publish message to the client
      ws.send "Hello Client"
    }

    ws.onclose { puts "Connection closed" }
    ws.onmessage { |msg|
      puts "Recieved message: #{msg}"
      ws.send "Pong: #{msg}"
    }
end
}

假设我只是运行了命令“rails new em-example”上面的代码在我的rails 3应用程序中的哪个位置?

我认为上面的代码理想情况下应该在一个单独的线程(或光纤......?)中运行,但不确定它看起来如何。

我已经看到,如果使用'thin'作为我的网络服务器,这应该很容易。 Heroku似乎默认使用它,我已经安装了'thin'宝石,所以我也可以在本地测试它。

1 个答案:

答案 0 :(得分:1)

您可能希望将代码投入初始化程序。 John Nunemaker posted some really interesting info关于在Sinatra应用程序中使用Passenger启动EventMachine,我想它对你来说会有相似的效果。

那就是说,听起来你只是想让一个Web套接字服务器与Heroku一起工作。从理论上讲,您认为在Cedar堆栈上运行并为您的基于EM的Websockets服务器的Procfile添加新的流程类型将使其正常工作。这看起来像是:

web:         bundle exec rails server -p $PORT
websocket:   bundle exec script/websocket_server $PORT

使用script / websocket_server作为应用程序的套接字服务器脚本,可以处理自定义端口参数。

不幸的是,Heroku不支持Websockets,如here所述,因此Procfile解决方案很可能不起作用。