我在瘦服务器和application.rb上运行了Rails 3.2应用程序我想启动EventMachine:
# application.rb
config.after_initialize do
if ENV['EM']
EM.run do
host = '0.0.0.0'
port = 3001
# hit Ctrl + C to stop
Signal.trap("INT") { EventMachine.stop }
Signal.trap("TERM") { EventMachine.stop }
EventMachine::start_server host, port, SomeModule
puts "EventMachine running on #{host}:#{port}. Ctrl + C to stop."
end
end
end
SomeModule的代码依赖于正在加载的Rails。这就是为什么我把它放在after_initialize块而不是初始化器中。
现在,当我启动服务器(使用rails s
)时,我的输出看起来很好:
=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
EventMachine running on 0.0.0.0:3001. Ctrl + C to stop.
但是当我在浏览器中访问localhost时,我得到204 No Content
响应。
我可以想到导致这种情况的几件事,但不是解决方案:)
答案 0 :(得分:3)
经过一些谷歌搜索后,我发现因为我使用Thin,所以我不需要运行另一个EventMachine。
我的after_initialize块现在看起来像这样:
config.after_initialize do
include SomeModule
end
在SomeModule中,我将代码包装在EM.next_tick
块中,或者我得到“eventmachine not initialized:evma_connect_to_server(RuntimeError)”错误。
在使用Thin的Rails应用程序中使用EventMachine比我想象的更容易:)
答案 1 :(得分:0)
您应该阻止自动加载调用EventMachine的ruby代码,否则它将阻止您的主线程。将脚本放到lib / daemons中,然后为EventMachine创建一个启动脚本并将其用作守护进程。即:
#!/usr/bin/env ruby
# this is: ./scripts/my_daemon
require 'daemons'
options = {
multiple: false,
backtrace: true,
app_name: 'my_daemon',
dir_mode: :normal,
dir: '/tmp/my_daemon',
log_dir: '/tmp/my_daemon',
log_output: true,
ARGV: ARGV,
}
system "mkdir -p /tmp/my_daemons"
Daemons.run(File.join(File.dirname(__FILE__), '../lib/daemons/my_daemon.rb'), options)
您需要在Gemfile中添加'daemons'gem。
然后从rails root运行script/my_daemon start
。还有更多命令:
您会在/tmp/my_daemons/my_daemon.output
在此处详细了解守护进程:http://daemons.rubyforge.org/Daemons.html