Bac*_*cko 1 ruby initialization ruby-on-rails delayed-job ruby-on-rails-3
我正在使用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
Run Code Online (Sandbox Code Playgroud)
但是,由于我总是希望在应用程序启动时启动worker,在我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
Run Code Online (Sandbox Code Playgroud)
但是,通过使用上面的代码并在重新启动Apache2服务器之后,DJ gem不再按预期工作.也就是说,当我在Terminal\Console中运行上述命令行时,它不处理作业.
如何让DJ正常工作?问题是什么?
PS:我想这样做是为了使流程自动化.
它接收config/initializers/delayed_job.rb文件中的上述代码不会"创建"与RAILS_ROOT/tmp/pids目录中的DJ相关的"pids"文件.这些只能通过手动运行上述命令行来创建.为什么会这样?
UPDATE的@Devin中号
我的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
Run Code Online (Sandbox Code Playgroud)
我不认为你可以这样做,因为当你启动'/ 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
Run Code Online (Sandbox Code Playgroud)
使用'&',delayed_job脚本在后台运行,与rails不同.如果已经运行,对rake的后续调用将跳过启动delayed_jobs.如果由于某种原因,在delayed_jobs终止时未删除该文件,您仍会遇到一些问题.
命令/ script/delayed_job状态将检测是否是这种情况,但你不能在这个'config/initializers/delayed_job.rb'文件中运行它,因为它会导致无限循环:(