我正在尝试运行一个在运行我的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'宝石,所以我也可以在本地测试它。
答案 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解决方案很可能不起作用。