我正在使用 Ruby on Rails 3.0.9,我正在尝试设置 delay_job gem 。如果在重新启动 Apache2 服务器后,我在 Terminal\Console 中运行以下命令,则一切正常:
RAILS_ENV=development script/delayed_job stop
RAILS_ENV=development script/delayed_job -n 2 start
但是,由于我总是希望在应用程序启动时启动工作人员,因此在我的 config/initializers/delayed_job.rb
中添加以下代码(处理开发和生产模式):
if Rails.env.development?
system 'RAILS_ENV=development script/delayed_job stop'
system 'RAILS_ENV=development script/delayed_job -n 2 start'
elsif Rails.env.production?
system 'RAILS_ENV=production script/delayed_job stop'
system 'RAILS_ENV=production script/delayed_job -n 2 start'
end
但是,通过使用上面的代码并在重新启动 Apache2 服务器后,DJ gem 不再像预期的那样工作。也就是说,它不会像我在 Terminal\Console 中运行上述命令行时那样处理作业。
如何让 DJ 正常工作?有什么问题?
P.S.:我想这样做是为了使流程自动化。
config/initializers/delayed_job.rb
文件中的上述代码不会在 RAILS_ROOT/tmp/pids 中“创建”与 DJ 相关的“pids”文件
目录。这些只能通过手动运行上述命令行来创建。为什么会这样?
@Devin M
更新
我的 config/initializers/delayed_job.rb
包含:
# Options
Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.sleep_delay = 2
Delayed::Worker.max_attempts = 5
Delayed::Worker.max_run_time = 1.hour
Delayed::Worker.delay_jobs = !Rails.env.test?
if Rails.env.development?
system "RAILS_ENV=development #{Rails.root.join('script','delayed_job')} stop"
system "RAILS_ENV=development #{Rails.root.join('script','delayed_job')} -n 2 start"
elsif Rails.env.production?
system "RAILS_ENV=production #{Rails.root.join('script','delayed_job')} stop"
system "RAILS_ENV=production #{Rails.root.join('script','delayed_job')} -n 2 start"
end
最佳答案
我不认为你可以那样做,因为当你启动'/script/delayed_job'时,rails环境将被加载,导致'config/initializers/delayed_job.rb'文件再次被执行。 您可以在无限循环中看到此结果。 同样,每次您调用 rake,例如:'rake db:migrate',它都会初始化 delayed_jobs。
你可以用这个破解它:
if Rails.env.production?
if(!File.exists?(Rails.root.join('tmp','pids', 'delayed_job.pid')))
system "echo \"Starting delayed_jobs...\""
system "./script/delayed_job start &"
else
system "echo \"delayed_jobs is running\""
end
end
使用“&”,delayed_job 脚本在后台运行,与 rails 不同的进程。 如果 rake 已经在运行,则对 rake 的后续调用将跳过启动 delayed_jobs。 如果出于某种原因,该文件在 delayed_jobs 终止时未被删除,您仍然会遇到一些问题。
命令 /script/delayed_job 状态 将检测是否是这种情况,但你不能在这个“config/initializers/delayed_job.rb”文件中运行它,因为它会导致无限循环:(
关于ruby-on-rails - 通过在应用程序启动时启动工作人员来初始化延迟作业 gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6994479/